首页 / 正则 / python --> 正则表达式
python --> 正则表达式
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了python --> 正则表达式,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含4766字,纯文字阅读大概需要7分钟。
内容图文
![python --> 正则表达式](/upload/InfoBanner/zyjiaocheng/1069/2763c696ce914452bdfed8e035d28e6c.jpg)
在python中使用正则表达式,需要导入 re 模块
一、 元字符,包括 [] {} | ? * + . ^ $ \ ()
. 号:通配符,一个点号就代表一个字符,一般情况下不能通配换行符 \n
* 号:控制前面的一个字符或是组,重复出现0至n次
+号:控制前面的一个字符或是组,重复出现1至n次
?号:控制前面的一个字符或是组,重复出现0或1次
{}号:内部加数字参数,固定重复次数,也可以写为 {3,5} 代表重复3/4/5次都ok
()号:把内部封装一起作为一组,一个整体
^号:控制开头
$号:控制结尾,
\号:后面跟元字符,去掉元字符的特殊含义,后面跟普通字符,赋予普通字符特殊意义,跟数字,引用序号对应的组所匹配到的字符串
\d:匹配任何十进制数字,相当于类[0-9]
\D:匹配任何非数字字符,相当于类[^0-9]
\s:匹配任何空白字符,相当于类[\t\n\r\f\v]
\S:匹配任何非空字符,相当于类[^\t\n\r\f\v]
\w:匹配任何字母数字字符,相当于类[0-9a-zA-Z]
\W:匹配任何非字母数字字符,相当于类[^0-9a-zA-Z]
\b:匹配一个单词边界,也就是指单词与空格间的位置
[]号:字符集,中括号里的内容之间存在或者的关系,取其一;放在字符集里的元字符失去意义,变为普通字符,^放在字符集里表示‘非’的意思;\d等在字符集里意义不变
| 号:代表‘或’,选其一
二、函数
re.match(pattern,string,flag = 0):从字符串的开头进行匹配
flag = 0 参数,可修改为 re.I 使匹配对大小写不敏感;re.S 使可以匹配出任意字符,包括换行符\n;re.M 多行匹配,会影响^ $
re.search(pattern,string,flag):浏览全部字符串,逐个字符匹配,匹配第一个符合规则的字符串
match 和 search 匹配的结果都是一个对象,对匹配到的对象进行处理,有如下方法
.group() 返回匹配到的字符串整体,括号内默认参数为0,如设置为1,则代表返回匹配到的第一组的结果
.groups() 获取匹配到的分组结果,只匹配pattern里组里的内容,以元组形式显示
.groupdict() 获取匹配到的结果,以字典形式显示,对于格式有要求,固定格式为 (?P<key名字>value)
![技术分享](/upload/getfiles/default/2022/11/7/20221107115236515.jpg)
![技术分享](/upload/getfiles/default/2022/11/7/20221107115236582.jpg)
1 origin = ‘hey everybody,say hello to the wonderful world!‘2 res = re.search(‘(?P<key1>h).+(lo)‘,origin) 3print(res.group(2)) 4print(res.group()) 5print(res.groups()) 6print(res.groupdict())
.start()返回匹配开始的位置
.end()返回匹配结束的位置
.span()返回包含匹配(开始,结束)的位置
origin = ‘hey everybody,say hello to the wonderful world!‘ res = re.search(‘(?P<key1>h).+(lo)‘,origin) print(res.group(2)) print(res.group()) print(res.groups()) print(res.groupdict()) print(res.start()) print(res.end()) print(res.span()) # 会涉及到正则表达式的贪婪模式,下文讲述
re.findall(pattern,string,flag) 将匹配到的所有内容以字符串形式作为元素,放到一个列表中;如果pattern中出现了组,即(),那么就按照所有的限制条件去匹配,但是仅将组里匹配出的内容返回给列表;如果规则里只有1个组,那么得到的列表里元素就是字符串,如果存在多个组,那得到的列表的元素为元组,每个元组的元素是字符串
1 import re 2 origin = ‘hello alex,again alex,bye acd‘ 3 res = re.findall(‘a(\w*)‘,origin) 4print(res) 5 res = re.findall(‘a(\w*)x‘,origin) 6print(res) 7 res = re.findall(‘(a)(\w*)(x)‘,origin) 8print(res) 910# 结果如下11 [‘lex‘, ‘gain‘, ‘lex‘, ‘cd‘] 12 [‘le‘, ‘le‘] 13 [(‘a‘, ‘le‘, ‘x‘), (‘a‘, ‘le‘, ‘x‘)]
几种特别注意情况
① 嵌套分组括号,执行完一遍外层,再执行一边内层,结果都返回
1 import re 2 origin = ‘ethan‘3 res = re.findall(‘(e)(\w*(a))(n)‘,origin) 4print(res) 56#结果如下78 [(‘e‘, ‘tha‘, ‘a‘, ‘n‘)]
②判断字符串中空元素个数,得到结果列表元素为空,个数比字符串长度多1
import re origin = ‘ethan‘ res = re.findall(‘‘,origin) print(res) # 结果如下 [‘‘, ‘‘, ‘‘, ‘‘, ‘‘, ‘‘]
③其他特殊情况,涉及分组个数与重复次数
import re origin = ‘ethan‘ res = re.findall(‘(\w)*‘,origin) print(res) n =re.findall(‘(\dasd)*‘,‘1asd2asdp3asd98k3f‘) print(n) # 虽然可以重复0-n次,但是实际分组只有1组,默认返回贪婪模式下最后一组结果 [‘n‘, ‘‘] [‘2asd‘, ‘‘, ‘3asd‘, ‘‘, ‘‘, ‘‘, ‘‘, ‘‘, ‘‘]
re.sub(pattern,repl,string,max=0) 替换掉字符串内容
re.subn() 最后会显示替换掉的次数,结果为元组形式,替换后的字符串为元素
1 import re 2 origin = ‘goodday,goodbye,good morning,oh my god‘ 3 res = re.sub(‘g\w+d‘,‘have‘,origin) 4print(res) 5 res = re.sub(‘g\w+d‘,‘have‘,origin,3) 6print(res) 7 res = re.subn(‘g\w+d‘,‘have‘,origin) 8print(res) 910#结果如下1112haveay,havebye,have morning,oh my have 13haveay,havebye,have morning,oh my god 14 (‘haveay,havebye,have morning,oh my have‘, 4)
re.split(pattern,string,maxsplit,flag) 按规则分割字符串
①分割规则里不包含组,那么分割出的结果里不包含分割规则 ②分割规则里包含组,那么分割出来的结果会包含组内容 ③如果分割规则处在string末尾或开始,那么会包含空内容成为元素
1 import re 2 origin = ‘one1two2three3‘ 3 res = re.split(‘\d+‘,origin) 4print(res) 5 6 stri = ‘nice to meet you ethan,but goodbye now‘ 7 res = re.split(‘e(\w+)an‘,stri) 8print(res) 9 res = re.split(‘ethan‘,stri) 10print(res) 1112#结果如下1314 [‘one‘, ‘two‘, ‘three‘, ‘‘] 15 [‘nice to meet you ‘, ‘th‘, ‘,but goodbye now‘] 16 [‘nice to meet you ‘, ‘,but goodbye now‘]
re.compile(pattern,flags) 将规则编译到obj里,下次再使用此规则时直接调用obj的方法,适用于重复多次使用的规则
1 import re 2 obj = re.compile(‘e(\w+)n‘) 3 origin = ‘nice to see you ethan,but byebye now‘ 4 res = obj.findall(origin) 5print(res) 6 res = obj.split(origin) 7print(res) 8 9#结果如下1011 [‘tha‘] 12 [‘nice to see you ‘, ‘tha‘, ‘,but byebye now‘]
re.finditer(pattern,string,flags) 生成迭代对象,需要进行for循环,才能得到对象,需要对象的.group(),.groups(),.groupdict()的方法得到具体值
1 import re 2 rigin = ‘alex,goodday‘ 3 res = re.finditer(‘a(\w*)(?P<key1>x)‘,origin) 4print(res) 5for i in res: 6print(i,i.group(),i.groups(),i.groupdict()) 7 8# 结果如下 9 <callable_iterator object at 0x000000DA49F7CB38> 10 <_sre.SRE_Match object; span=(0, 4), match=‘alex‘> alex (‘le‘, ‘x‘) {‘key1‘: ‘x‘}
三、贪婪模式与非贪婪模式
默认情况下,所有匹配均为贪婪模式,除非对匹配方式进行了设置,例如
1 import re 2 origin = ‘a23018319cdnk‘ 3 res = re.search(‘a(\d+)‘,origin).group() 4print(res) 5 res = re.search(‘a(\d+?)‘,origin).group() 6print(res) 7 8#显示结果如下 9a23018319 10 a2
但是在组两边都有限制条件的时候,非贪婪模式也会失效,例如
import re res = re.search(‘a(\d+?)‘,origin).group() print(res) res = re.search(‘a(\d+?)c‘,origin).group() print(res) #结果如下 a2 a23018319c
四、原生字符r ,使用时表示在python中存在特殊意义的字符,失去特殊意义,只体现其普通意义,而re模块中的则不受影响
正则表达式' ref='nofollow'>python --> 正则表达式
原文:http://www.cnblogs.com/ethancui/p/5582446.html
内容总结
以上是互联网集市为您收集整理的python --> 正则表达式全部内容,希望文章能够帮你解决python --> 正则表达式所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。