re模块与正则表达式
Posted yang220
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了re模块与正则表达式相关的知识,希望对你有一定的参考价值。
首先要先继承re模块: import re
re.findall() 方法 # 返回值为列表
w 表示一个字符,为数字,字母,下滑线之一, W匹配任意非数字,字母,下划线
print(re.findall(‘w3w‘,‘abc3dafg375983_‘)) # 输出结果为: [‘c3d‘, ‘g37‘, ‘83_‘]
print(re.findall(‘2W‘,‘abc2_ 2 3| 2|‘)) # 输出结果为: [‘2 ‘, ‘2|‘]
s 表示匹配 任意空白字符( f 分别表示:水平制表符,移动到下一个tab的位置; 换行符; 回车; 换页) S匹配任意 非空字符
print(re.findall(‘2s‘,‘abc2f_ 2 3| 2 ‘)) # 输出结果为 [‘2x0c‘, ‘2 ‘, ‘2 ‘];
若将代码改为: print(re.findall(‘2s‘,‘abc2\\f_ 2 3| 2\\t‘)) ,则 输出结果为: [‘2 ‘]
d 匹配任意数字(0-9), D匹配任意非数字
print(re.findall(‘d‘,‘abc3dafg375983_‘)) #输出结果为: [‘3‘, ‘3‘, ‘7‘, ‘5‘, ‘9‘, ‘8‘, ‘3‘]
print(re.findall(‘D‘,‘abc3dafg375983_‘)) #输出结果为: [‘a‘, ‘b‘, ‘c‘, ‘d‘, ‘a‘, ‘f‘, ‘g‘, ‘_‘]
Ax 匹配字符串开始(x表示需要找的字符串),如字符串是以要找的字符串开头,则返回这个字符串,若不是则结束匹配
print(re.findall(‘Aa‘,‘abc3dafg375983_‘)) #输出结果为: [‘a‘]
x 匹配字符串结束(x表示需要找的字符串)
print(re.findall(‘3‘,‘abc3dafg375983_‘)) #输出结果为: [ ] 表示空列表,表示字符串不是以3结尾
^ 字符串开头匹配(判段开头是否为要找的字符串,并返回值,若不是,则结束寻找)
$ 从末尾开始匹配(判段结尾是否为要找的字符串,并返回值,若不是,则结束寻找)
print(re.findall(‘^c3‘,‘c3abc3dafg37c3983_‘)) 输出结果为: [‘c3‘]
print(re.findall(‘c3$‘,‘c3abc3dafg37c398c3_‘)) 输出结果为: [ ]
. :匹配除换行符之外的任意字符, 加上flag:re.DOTALL 即可匹配换行符
print(re.findall(‘a.c‘,‘abc a c a|ca#ckfaabbc‘)) 输出结果为:[‘abc‘, ‘a c‘, ‘a|c‘, ‘a#c‘]
[...] :表示匹配一组字符中的一个字符
print(re.findall(‘[b.]‘,‘abc a c a|ca#ckfa.abbc‘)) 输出结果为: [‘b‘, ‘.‘, ‘b‘, ‘b‘]
print(re.findall(‘a[a-zA-Z]c‘,‘aBcfagchka|c‘,re.DOTALL)) 输出结果为: [‘aBc‘, ‘agc‘]
重复匹配:
? :表示在?左边的字符出现0次或1次
print(re.findall(‘ab?‘,‘a ab abb abc acf b ab a21b‘)) # 在此情况下表示 , b出现一次或0次的字符串,结果为: [‘a‘, ‘ab‘, ‘ab‘, ‘ab‘, ‘a‘, ‘ab‘, ‘a‘]
* :0次到无穷多次
print(re.findall(‘ab*‘,‘aababbaaabbb‘)) #输出结果为: [‘a‘, ‘ab‘, ‘abb‘, ‘a‘, ‘a‘, ‘abbb‘]
+ :1次或无穷多次
print(re.findall(‘ab+‘,‘a ab abb bb abbb aaabbb‘)) # 输出结果为: [‘ab‘, ‘abb‘, ‘abbb‘, ‘abbb‘]
.* :贪婪匹配,尽可能多的吞噬字符
print(re.findall(‘a.*c‘,‘aasfakfipgld csagsdpp cas‘)) # 输出结果为: [‘aasfakfipgld csagsdpp c‘]
.*? : 非贪婪匹配,尽可能少的吞噬字符
print(re.findall(‘a.*?c‘,‘aasfakfipgld csagsdpp cas‘)) # 输出结果为: [‘aasfakfipgldc‘, ‘agsdpp c‘]
| :表示或者
print(re.findall(‘yang|huang‘,‘yang is a boy huang is a girl‘)) #输出结果为: [‘yang‘, ‘huang‘]
() : 表示分组,默认情况下只保留括号内的数据, 在括号内加入?:则会保留完整的 (此处有误,正确答案会在之后更新)
print(re.findall(‘email.:(?:.*?) ‘,‘email1:[email protected] email2:[email protected] eamil3:[email protected]‘))
输出结果为: [‘[email protected]‘, ‘[email protected]‘]
print(re.findall(‘email.:(.*?)‘,‘email1:[email protected] email2:[email protected] eamil3:[email protected]‘))
输出结果为:
re.I # 忽略大小写
print(re.findall(‘alex‘,‘aLex is Alex is alExandaleX‘,re.I)) # 输出结果为:[‘aLex‘, ‘Alex‘, ‘alEx‘, ‘aleX‘]
re.M #忽略换行符
msg="""
ahfquqfqioiyang
sfahsifpofayang
fdi352526yang
# """
print(re.findall(‘yang$‘,msg,re.M)) # 输出结果为: [‘yang‘,‘yang‘,‘yang‘]
re.search()方法 找到一个即停止
print(re.search(‘alex‘,‘alex is alex is alex‘)) # 输出结果为: <_sre.SRE_Match object; span=(0, 4), match=‘alex‘>
re.match()方法 找开头,没有找到则结束
print(re.match(‘alex‘,‘alex is alex is alex‘)) # 输出结果为: <_sre.SRE_Match object; span=(0, 4), match=‘alex‘>
从上述代码可以看出search方法与match方法返回结果比较相似
小练习:找到以下字符串中所有的数字(正数,负数,小数):
msg="1-2*(60+(-40.35/5)-(-4*3))"
代码为:
print(re.findall(‘D?(-?d+.?d*)‘,msg))
结果为:
[‘1‘, ‘2‘, ‘60‘, ‘-40.35‘, ‘5‘, ‘-4‘, ‘3‘]
以上是关于re模块与正则表达式的主要内容,如果未能解决你的问题,请参考以下文章