Python本不等于正则语言,它只是内部集成了一个正则引擎,这个引擎实现了正则语言的功能,在Python中,这个引擎就是re模块。所以,你要先‘import re’。
下面网页详细介绍了正则本身和re模块,可供参考,基本上覆盖了所有内容。
提取三个版本的程序testing log中的test case名和测试结果,并对比不同版本程序的每一个case的结果,再计算每个test case在三个版本中的失败率。
//不熟悉如何写正则表达式的参考 我的上一篇文章
注意方法括号内的语法为r"你的正则表达式"
recompile() 方法生成一个正则表达式对象,调用此对象的方法findall(),输入待处理的string,得到所有匹配结果。返回值类型为list,例:Output: ['123456789', '987654321']
若你的正则表达式有多个capture group,则为list包括的tuple。
直接用list创建DataFrame对象,参数为list和你给出的列名,在这里‘case’为第一列的列名,第二列列名通过传入的变量version确定
得到结果类如表格
因为程序testcase的ID本身就是唯一的,用作index方便join,所以我们不再需要默认的数字index
使用df的 join() 方法,将所有版本的df在'case'列,也就是我们的index列进行left join
最后,我们返回dfs[0],也就是完成全部左交后的总结果。
输出结果如下:
python中提供了3种通过正则表达式匹配字符串的方法。种通过正则表达式匹配字符串的方法有以下三种。
1、贪婪匹配与非贪婪匹配:在定义用于匹配的模式串时,使用,则为贪婪匹配。使用,则为非贪婪匹配。
2、indall与search的选取问题:自己定义的模式串只能匹配到一个结果,使用search方法结合group方法可以直接得到这个字符串。自己定义的模式串能匹配到多个结果,则使用findall方法可以得到存储多个结果字符串的列表。
3、匹配时"()"和[]的用法:目标字符串‘abcde’[…]会匹配在[]内的任意一个字符,而不会匹配整个字符串。(…)会匹配在()内的整个字符串。使用search方法时则正常匹配(相当于没有()),使用findall方法时则只会匹配(…)的内容。)[]同时出现,考虑(…)式的字符串与[…]式内的字符和顺序,使用findall方法时结果会舍弃[…]内容,使用search方法时则正常匹配(相当于没有()和[])。
针对你所给的示例字符串,貌似无法一次性地提取出后面的那个abc的,只能提取出前面的ammmmmde:
可以这样写:
>>> refindall(r'(:\d+)([a-zA-Z]+)', 'sssa 123ammmmmde234abc aaaaa 123ammmmmde234abc llll')
['ammmmmde', 'abc', 'ammmmmde', 'abc']
原因在于:正则从左往右查找,没有在找后面的abc时,也去找到之前的abc。
因为之前的abc,被在查找ammmmmde时,藏在中间了:
123ammmmmde234abc aaaaa 123ammmmmde
搜索过了,后面没法再搜索。
一个折中的办法是,用:
>>> refindall(r'(:\d+)([a-zA-Z]+)', 'sssa 123ammmmmde234abc aaaaa 123ammmmmde234abc llll')
['ammmmmde', 'abc', 'ammmmmde', 'abc']
找到上述的
['ammmmmde', 'abc', 'ammmmmde', 'abc']
然后你自己再另外提取,组合出来你要的:
[(ammmmmde, ammmmmde), (abc, abc)]
01 Re概览
Re模块是python的内置模块,提供了正则表达式在python中的所有用法,默认安装位置在python根目录下的Lib文件夹(如 \Python\Python37\Lib)。主要提供了3大类字符串 *** 作方法:
字符查找/匹配
字符替换
字符分割
由于是面向字符串类型的模块,就不得不提到字符串编码类型。re模块中,模式串和搜索串既可以是 Unicode 字符串 (常用str类型) ,也可以是8位字节串 (bytes,2位16进制数字,例如\xe5) , 但要求二者必须是同类型字符串。
02 字符串查找/匹配
预编译:compile
在介绍查找和匹配函数前,首先需要知道re的compile函数,该函数可以将一个模式串编译成正则表达式类型,以便后续快速匹配和复用
import re pattern = recompile(r'[a-z]{2,5}') type(pattern) #rePattern
此例创建了一个正则表达式式对象 (repattern) ,命名为pattern,用于匹配2-5位小写字母的模式串。后续在使用其他正则表达式函数时,即可使用pattern进行方法调用。
匹配:match
match函数用于从文本串的起始位置开始匹配,若匹配成功,则返回相应的匹配对象,此时可调用group()方法返回匹配结果,也可用span()方法返回匹配起止下标区间;否则返回None
import re pattern = recompile(r'[a-z]{2,5}') text1 = 'this is a re test' res = patternmatch(text1) print(res) # if res: print(resgroup()) #this print(resspan()) #(0, 4) text2 = '是的, this is a re test' print(patternmatch(text2))#None
match函数还有一个变形函数fullmatch,当且仅当模式串与文本串刚好全部匹配时,返回一个匹配对象,否则返回None
搜索:search
match只提供了从文本串起始位置匹配的结果,如果想从任意位置匹配,则可调用search方法,与match方法类似,当任意位置匹配成功,则立即返回一个匹配对象,也可调用span()方法获取起止区间、调用group方法获得匹配文本串
import re pattern = recompile(r'\s[a-z]{2}') text1 = 'this is a re test' res = patternsearch(text1) print(res) # if res: print(resgroup()) #is print(resspan()) #(4, 7) pattern2 = recompile(r'\s[a-z]{5}') text2 = '是的,this is a re test' print(pattern2search(text2))#None
match和search均用于匹配单个结果,唯一区别在于前者是从起始位置开始匹配,而后者从任意位置匹配,匹配成功则返回一个match对象。
全搜索:findall/finditer
几乎是最常用的正则表达式函数,用于寻找所有匹配的结果,例如在爬虫信息提取中,可非常方便地提取所有匹配字段
import re pattern = recompile(r'\s[a-z]{2,5}') text1 = 'this is a re test' res = patternfindall(text1) print(res) #[' is', ' re', ' test']
findall返回的是一个列表对象类型,当无匹配对象时,返回一个空列表。为了避免因同时返回大量匹配结果占用过多内存,可以调用finditer函数返回一个迭代器类型,其中每个迭代元素是一个match对象,可继续调用group和span方法获取相应结果
import re pattern = recompile(r'\s[a-z]{2,5}') text1 = 'this is a re test' res = patternfinditer(text1) for r in res: print(rgroup()) """ is re test """
当匹配模式串较为简单或者仅需单词调用时,上述所有方法也可直接调用re类函数,而无需事先编译。此时各方法的第一个参数为模式串。
import re pattern = recompile(r'\d{2,5}') text = 'this is re test' refindall('[a-z]+', text) #['this', 'is', 're', 'test'] 03 字符串替换/分割
替换:sub/subn
当需要对文本串进行条件替换时,可调用resub实现 (当然也可先编译后再用调用实例方法) ,相应参数分别为模式串、替换格式、文本串,还可以通过增加缺省参数限定替换次数和匹配模式。通过在模式串进行分组,可实现字符串的格式化替换(类似字符串的format方法),以实现特定任务。
import re text = 'today is 2020-03-05' print(resub('-', '', text)) #'today is 20200305' print(resub('-', '', text, 1)) #'today is 202003-05' print(resub('(\d{4})-(\d{2})-(\d{2})', r'\2/\3/\1', text)) #'today is 03/05/2020'
resub的一个变形方法是resubn,区别是返回一个2元素的元组,其中第一个元素为替换结果,第二个为替换次数
import re text = 'today is 2020-03-05' print(resubn('-', '', text)) #('today is 20200305', 2)
分割:split
还可以调用正则表达式实现字符串的特定分割,相当于split()方法的一个加强版,实现特定模式的分割,返回一个切割后的结果列表
import re text = 'today is a re test, what do you mind' print(resplit(',', text)) #['today is a re test', ' what do you mind'] 04 总结
python中的re模块提供了正则表达式的常用方法,每种方法都包括类方法调用(如rematch)或模式串的实例调用(patternmatch)2种形式
常用的匹配函数:match/fullmatch
常用的搜索函数:search/findall/finditer
常用的替换函数:sub/subn
常用的切割函数:split
还有其他很多方法,但不是很常用,具体可参考官方文档
另外,python还有第三方正则表达式库regex可供选择
到此这篇关于一文秒懂python正则表达式常用函数的文章就介绍到这了,希望大家以后多多支持!
正则表达式
import recontent="你的页面"
result=research('匹配模式',content)
if result:
print resultgroup(1)
else:
print "not find !"
这事一个大概的思路!
以上就是关于python 正则表达式怎么匹配全部的内容,包括:python 正则表达式怎么匹配、快速入门|Python DataFrame +正则表达式处理数据实例一则、python中提供了哪几种通过正则表达式匹配字符串的方法有哪等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)