大家好,欢迎来到IT知识分享网。
参考博文: Python之路 – day22 python内置模块3 re模块(正则)
re模块(正则)
就其本质而言,正则表达式(或 RE)是一种小型的、高度专业化的编程语言,(在Python中)它内嵌在Python中,并通过 re 模块实现。正则表达式模式被编译成一系列的字节码,然后由用 C 编写的匹配引擎执行。
re.find( str1,str2) 将str2中所有符合str1匹配规则的,挑出来,添加进列表,并返回列表
- str1, 第一个参数: 匹配规则
- str2, 第二个参数: 目标字符串
re.search(str1,str2) 在str2中从前往后按照str1匹配规则搜索,找到一个匹配项后,就不在往后搜索了,即结果只会有一个匹配项。
如果有匹配项,则返回的是一个对象,可通过该对象.group()提取 匹配的结果信息;如果没有匹配到,则返回None
- str1, 第一个参数: 匹配规则
- str2, 第二个参数: 目标字符串
字符匹配(普通字符,元字符):
1. 普通字符:
大多数字符和字母都会和自身匹配
>>> re.findall(‘alvin’,’yuanaleSxalexwupeiqi’)
[‘alvin’]
2. 元字符: . ^ $ * + ? { } [ ] | ( ) \
import re #1 . ret = re.findall('a..in', 'helloalvin') # .是通配符,即可匹配任何字符,一个.匹配一个字符 print('.通配符:',ret) # ['alvin'] #2 ^ ret = re.findall('^a...n', 'alvinhelloawwwn') # ^是起始符,即从目标字符串起始处查找,是否以指定字符开头 print('^起始匹配:',ret) # ['alvin'] #3 $ ret = re.findall('a...n$', 'alvinhelloawwwn') # $是终止符,即如果目标字符串以指定的字符串结尾,则返回匹配的字符串 print('$终止匹配:',ret) # ['awwwn'] #---------------------------------------------------------------- #4 * ret = re.findall('abc*', 'abcccc') # 贪婪匹配[0,+oo] *是重复匹配,*号用来修饰其前一个字符,代表该字符的重复个数为 0到无穷大 print("*重复匹配:",ret) # ['abcccc'] ret=re.findall('abc*','ertabyu') print("*重复匹配:",ret) # ['ab'] #5 + ret = re.findall('abc+', 'abccc') # [1,+oo] +是重复匹配,+号用来修饰其前一个字符,代表该字符的重复个数为 1到无穷大 print('+重复匹配:',ret) # ['abccc'] ret = re.findall('abc+', 'abRcd') print('+重复匹配:',ret) # [] #6 ? ret = re.findall('abc?', 'abccc') # [0,1] ?是重复匹配,?号用来修饰其前一个字符,代表该字符的重复个数为 0或1 print('?重复匹配:',ret) # ['abc'] ret = re.findall('abc?', 'abecc') print('?重复匹配:',ret) # ['ab'] # {} # {0,} 等同于 * # {1,} 等同于 + # {0,1} 等同于 ? # {n} 修饰前一个字符,代表该字符的重复匹配个数必须有 n个 # {m,n} 修饰前一个字符,代表该字符的重复匹配个数范围是 m-n (包含m,n) ret = re.findall('abc{1,4}', 'abccc') print(ret) # ['abccc'] 贪婪匹配
3. 元字符之字符集[]:
3.1 字符集里[ ]里,只有 ^ 代表 非,\,- 代表什么; 其他的元字符,比如 . * + ? $ () ,都只是当作普通字符
3.2 常用的 [a-z], [A-Z], [A-z], [0-9] 分别表示一个指定区间内,小写/大写/数字 形式的字符
3.3 [ ]里,如果有多个普通字符,只是代表 或 的关系,即一个字符集[ ]在最终匹配的时候,只会匹配一个字符
import re # --------------------------------------------字符集[] ret = re.findall('a[bc]d', 'eracdrrabdu') # 字符集,[bc] 代表匹配 b或 c print(ret) # ['acd', 'abd'] ret = re.findall('[a-z]', 'acd') #[a-z] 表示 匹配 a-z之间的所有小写字母。 print(ret) # ['a', 'c', 'd'] ret = re.findall('[.*+]', 'a.cd+') # [ ] 里的.*+ 都当普通字符处理,即匹配 .或 * 或 + print(ret) # ['.', '+'] # 在字符集里有功能的符号: - ^ \ ret = re.findall('[3-9]', '45012dha3') # [3-9] 表示匹配 3-9之间的所有数字 print(ret) # ['4', '5', '3'] ret = re.findall('[^ab]', '45bdha3') # [ ]里的^ 不再是起始匹配符,而是 逻辑“非” 此例: ^表示匹配除a和b以外的任意字符 print(ret) # ['4', '5', 'd', 'h', '3'] ret = re.findall('[\d]', '45012bdha3') # \d 表示匹配0-9之间的所有数字,等同于[0-9] print(ret) # ['4', '5', '0', '1', '2', '3']
4.元字符之 转义符(反斜杠) \
反斜杠 后边跟 元字符: 去除特殊功能,当普通字符处理, 比如 \. \* \+ \? \\
反斜杠 后边跟 普通字符: 实现特殊功能,比如\d
\d 匹配任何十进制数;它相当于类 [0-9]。
\D 匹配任何非数字字符;它相当于类 [^0-9]。
\s 匹配任何空白字符;它相当于类 [ \t\n\r\f\v]。
\S 匹配任何非空白字符;它相当于类 [^ \t\n\r\f\v]。
\w 匹配任何字母数字字符;它相当于类 [a-zA-Z0-9_]。
\W 匹配任何非字母数字字符;它相当于类 [^a-zA-Z0-9_]
\b 匹配一个特殊字符边界,比如 空格 ,&,#,@,$,%,& 等特殊字符
#python解释器 和 re 模块里,\都是作为转义字符处理的。所以,如果re模块,要接收一个\,在python解释器里,得有两个\\,这样,re模块才能接收到一个\
import re ret=re.findall('I\b','I am LIST') # \b在python里已经有特殊意义,所以,python会对\b进行处理后,再提交给re模块,所以,re模块接收到的将不再是\b,所以不能匹配到想要的结果 print(ret) #[] ret=re.findall(r'I\b','I am LIST') #在前面加r,表示告诉python解释器,后面的字符不用转义处理,这样re模块就能正确接收到\b print(ret) #['I'] ret=re.findall('I\\b','I am LIST') #一个\,有特殊意义,在\前面再加一个\,代表第二个\就是当普通字符来处理,最终提交给re模块的 就是\b,所以也能达到要求 print(ret) #['I']
#python解释器 和 re 模块里,\都是作为转义字符处理的。所以,如果re模块,要接收一个\,在python解释器里,得有两个\\,这样,re模块才能接收到一个\
# ret=re.findall('a\l',"adfa\ldf") # pycharm直接 标红提示
# print(ret)
# ret=re.findall('a\\l',"adfa\ldf") # pycharm直接 标红提示
# print(ret)
ret=re.findall('a\\\\l',"adfa\ldf") # '\\\\'被python解释器处理后,变成-->> '\\',提交给re模块,re模块才能正确的将目标字符串中的\匹配出来 print(ret) #['a\\l'] ret=re.findall(r'a\\l',"adfa\ldf") # 前面加 r,python解释器,直接将\\提交给re,所以,也能达到同样的效果 print(ret) #['a\\l']
5.元字符之分组 ( )
m = re.findall('(ad)+', 'adddddc') #()用来分组,即()里的当成一个整体 print(m) # ['ad'] # re.search() 方法 和 re.findall() 的不同 ret = re.search('(?P<id>\d{2})/(?P<name>\w{3})', '23/comrtu') # \w:匹配任何字母数字字符 \d: 匹配任何十进制数 ?P<**>表示别名,便于取出匹配项中的某部分 print(ret.group()) # 23/com print(ret.group('id')) # 23 print(ret.group('name')) # com
注意,以下情况
import re res=re.findall('(abc)+',"abcabcabcyyyy") #匹配的结果是: abcabcabc,但由于存在()分组,abc当成一个整体,优先级较高,最终打印的只有一个abc print(res) # ['abc'] res=re.findall('(?:abc)+',"abcabcabcyyyy") #在()分组里,前面加上?: 代表取消分组优先级,将会显示所有结果 print(res) # ['abcabcabc']
6.元字符之|(或)
ret=re.findall('ab|c','aADaceraby') # |两侧的当成两部分 print(ret)
7.re模块 常用方法
# 3 ret=re.match('\de','rer8ea') print(ret) # None ret=re.match('\de','8earer6eu') print(ret) #<re.Match object; span=(0, 2), match='8e'> print(ret.group()) # 8e # 4 ret=re.split('[-|]','A-BCD|df9') # 同时按-和|进行分割,并返回分割后的列表 print(ret) # ['A', 'BCD', 'df9'] ret=re.split('[ab]','aerabtuy') # 注意此例的结果 (先按照a分割,再把结果按b分割) print(ret) # ['', 'er', '', 'tuy']
# 5 ret = re.sub('\d', 'abc', 'alvin5yuan6yu8', 1) #替换 (最后一个参数是替换的次数,不填的时候,默认全部替换) print(ret) # alvinabcyuan6yu8 #只替换一个时,返回替换后的字符串 ret = re.subn('\d', 'abc', 'alvin5yuan6yu8') print(ret) # ('alvinabcyuanabcyuabc', 3) #替换多个时,返回一个元组,包含替换后的字符串,以及替换的次数 # 6 obj = re.compile('\d{3}') #re.compile() 可以将匹配规则固定,便于大量重复使用 ret = obj.search('abc123eeee') print(ret.group()) # 123 ret=obj.findall("rt9876yt") print(ret) #['987']
import re # 7 ret = re.finditer('\d', 'ds3sy4784a') #类似于findall,不过finditer的结果是一个迭代器,便于大数据量时的节省内存 print(ret) # <callable_iterator object at 0x10195f940> print(next(ret).group()) # 3 print(next(ret).group()) # 4
注意点
ret = re.findall('www.(baidu|oldboy).com', 'www.oldboy.com') print(ret) # ['oldboy'] 这是因为findall会优先把匹配结果组里内容返回,如果想要匹配结果,取消权限即可 ret = re.findall('www.(?:baidu|oldboy).com', 'www.oldboy.com') #分组时,前面加上?:可以取消优先级 print(ret) # ['www.oldboy.com']
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/27733.html