正则与re模块

99封情书 提交于 2019-11-29 02:24:17

一、正则表达式

在线测试工具 http://tool.chinaz.com/regex/

1.字符组

  1. 同一个位置可能出现的各种字符组成一个字符组,在正则表达中用[ ]表示

  2. 一个正则就是一条匹配规则,可以规定一次匹配字符的长度,字符组每次匹配一个长度为1的字符,例如:待匹配字符为:2a+ 使用字符组进行匹配时就会进行三次比较

正则待匹配字段匹配结果说明
[0123456789] 5 5 在一个字符组里枚举所有合法的字符,待匹配字符与其中一个相同,即便匹配成功
[0123456789] 56 5和6 匹配个数为2 (见第二条说明)
[0-9] 7 7 用-表示范围,[0-9]和[0123456789]规则相同
[a-z] h h 匹配所有的小写字母
[a-z] 7h h 匹配个数为1
[A-Z] B B 匹配所有的大写字母
[0-9a-dA-D] 1ecD 1、c和D 匹配个数为3 (该正则可以匹配十六进制字符)

2.字符

元字符待匹配字符匹配个数匹配说明
. 1$,a 4 匹配除换行符以外的任意字符
\w _1w@ 3 匹配字母数字下划线
\W _1w@ 1 匹配非字母数字下划线
\s     匹配空白(空格、换行和tab)
\S     匹配非空白
\d     匹配数字
\D     匹配非数字
\n     匹配一个换行符
\t     匹配一个制表符
\b a 2+ 4 匹配字符的开始或结束
^     匹配字符串的开始
$     匹配字符串的结束
a|b acfb 2 符合|左右其一即可
(012) 0123 1 匹配括号内的表达式(整体),与[012]区分
[^123] 28291 2 匹配非括号内的所有字符

3.量词

量词说明
* 重复0次或多次
+ 重复1次或多次
重复0次或1次
{n} 重复n次
{n,} 重复n次或更多次(至少n次)
{n,m} 重复n次到m次

4.转义

正则待匹配字符匹配 结果说明
\n \n False 因为在正则表达式中\是有特殊意义的字符,所以要匹配\n本身,用表达式\n无法匹配
\n \n True 转义\之后变成\\,即可匹配
\\\\n \\n True 如果在python中,字符串中的'\'也需要转义,所以每一个字符串'\'又需要转义一次
r'\n' r'\n' True 在字符串之前加r,让整个字符串不转义

5.贪婪匹配

贪婪匹配:在满足匹配时,匹配尽可能长的字符串,默认情况下,采用贪婪匹配

正则待匹配字符匹配 结果说明
<.*> <script>...<script> <script>...<script> 默认为贪婪匹配模式,会匹配尽量长的字符串
<.*?> r'\d' <script> <script> 加上?为将贪婪匹配模式转为非贪婪匹配模式,会匹配尽量短的字符串
#贪婪匹配,回溯算法#\d+8    123456812381281766 匹配结果:12345681238128

二、re模块

python官方文档:https://docs.python.org/zh-cn/3.7/library/re.html?highlight=re#module-re

1.findall()

返回字符串中所有非重叠匹配项的列表。

import reret = re.findall('aba', 'cababa') print(ret) #结果:['aba']​ret = re.findall('a', 'cababa') print(ret) #结果:['a', 'a', 'a']
2.finditer()函数

返回一个含有所有非重叠匹配项的迭代器

ret = re.finditer('a', '1a2a3ab')  print(ret)r1=ret.__next__()r2=ret.__next__()print(r1,r2)#运行结果:<callable_iterator object at 0x0370E450><re.Match object; span=(1, 2), match='a'> <re.Match object; span=(3, 4), match='a'> StopIteration
3.fullmatch()

完全匹配。

ret = re.fullmatch('aba', 'cababa') print(ret)#结果:None​ret = re.fullmatch('aba', 'aba') print(ret)#<re.Match object; span=(0, 3), match='aba'>
4.match()

尝试在字符串的开头应用该模式,返回匹配对象(不可迭代),如果没有找到匹配,则为None。

ret = re.match('aba', 'cababa') print(ret)#结果:None​ret = re.match('aba', 'ababac') print(ret)re1=ret.group(0)print(re1)#结果:<re.Match object; span=(0, 3), match='aba'>aba​​
5.search()

扫描字符串,寻找与模式匹配的字符串,然后返回匹配对象(不可迭代),如果没有找到匹配,则为None。

ret = re.search('aba', 'cababa') print(ret)#结果:<re.Match object; span=(1, 4), match='aba'>​
6.split(self, /, string, maxsplit=0)

根据模式的出现情况拆分源字符串,返回包含结果子字符串的列表。如果捕获括号在pattern中使用,然后是all的文本模式中的组也作为结果的一部分返回列表。如果maxsplit不为零,则最多发生maxsplit拆分,字符串的其余部分作为最后一个元素返回的列表。

ret = re.split('aba', 'cababa1aba') print(ret) #结果:['c', 'ba1', '']  #最后一次分割为空​ret = re.split('aba', 'cababa1aba2') print(ret) #结果:['c', 'ba1', '2']​ret = re.split('aba', 'cababa1aba2',maxsplit=1) print(ret) #结果:['c', 'ba12']​ret = re.split('[ab]', 'abcd')  # 先按'a'分割得到''和'bcd',在对''和'bcd'分别按'b'分割print(ret)  # 结果['', '', 'cd']​
7.sub(pattern, repl, string, count=0, flags=0)

返回通过pattern非重叠替换repl得到的字符串。

  • repl可以是字符串,也可以是可调用的;

  • 如果是字符串,则处理其中的反斜杠转义。

  • 如果它是一个可调用的对象,它传递了Match对象并必须返回要使用的替换字符串

ret = re.sub('\d{2}','+', '2ad232c') print(ret) #结果:2ad+2c​import randomdef fun(s):    i = random.randint(0,len(s))    return s[i]ret = re.sub('\d{2}',fun('#$%'), '2ad232c') print(ret) 
8.subn(pattern, repl, string, count=0, flags=0)

返回通过pattern非重叠替换repl得到的字符串与替换次数组成的二元组。

  • repl可以是字符串,也可以是可调用的;

  • 如果是字符串,则处理其中的反斜杠转义。

  • 如果它是一个可调用的对象,它传递了Match对象并必须返回要使用的替换字符串

ret = re.subn('\d{2}','+', '2ad232c') print(ret) #结果:('2ad+2c', 1)
9.compile()

将正则表达式编译成为一个 正则表达式对象

obj = re.compile('\d{3}') ret = obj.search('abc123d') #正则表达式对象调用search,参数为待匹配的字符串print(ret.group()) #结果:123
10.template(pattern, flags=0)

编译一个模板模式,返回一个模式对象

11.purge()

清除正则表达式缓存

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!