re模块与正则表达式
1.正则表达式
官方定义:正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定的字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一 种过滤逻辑。
SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。常见的元字符:
元字符 | 匹配内容 |
. | 匹配换行符以外的任意字符 |
\w | 匹配字母或数字或下划线 |
\s | 匹配任意空白符 |
\d | 匹配数字 |
\n | 匹配一个换行符 |
\t | 匹配一个制表符 |
\b | 匹配一个单词的结尾 |
^ | 匹配字符串的开始 |
$ | 匹配字符串的结尾 |
\W | 匹配非字母或数字或下划线 |
\D | 匹配非数字 |
\S | 匹配非空白字符串 |
a|b | 匹配字符a或字符b |
() | 匹配括号内的表达式,也表示一个组 |
[...] | 匹配字符组中的字符 |
[^...] | 匹配除了字符组中字符的所有字符 |
量词:
量词 | 用法说明 |
* | 重复零次或更多次 |
+ | 重复一次或更多次 |
? | 重复零次或一次 |
{n} | 重复n次 |
{n,} | 重复n次或更多次 |
{n,m} | 重复n到m次 |
贪婪匹配:在满足匹配时,匹配尽可能长的字符,默认情况下,采用贪婪匹配。
几个常用的非贪婪匹配:
*? 重复任意次,但尽可能少重复。
+? 重复1次或更多次,但尽可能少重复。
?? 重复0次或1次,但尽可能少重复。
{n,m}? 重复n到m次,但尽可能少重复。
{n,}? 重复n次以上,但尽可能少重复。
.*?的用法:
. 是任意字符 * 是取0至无限长度 ? 是非贪婪模式。 合在一起就是取尽量少的任意字符,一般不会单独写,大多用在: .*?x 就是取前面任意长度的字符,直到一个x出现。
2.re模块下的常用方法
findall ---------- 返回所有满足匹配条件的结果,放在列表中。
import re a = re.findall('[a-z]+', 'this is why we play') print(a)
search ---------- 从前往后,找到一个就返回,返回的变量需要调用group才能拿到结果。
import re a = re.search('a', 'this is why we play') if a: print(a.group())
math ----------- 从头开始匹配,如果正则规则从头开始可以匹配上就返回一个变量。
import re a = re.match('e', 'this is why we play') # 头上并没有匹配的 if a: print(a.group())
split
import re a = re.split('[ab]', 'abcd') # 先按'a'分割得到''和'bcd'在对''和'bcd'分别按'b'分割。 print(a)
sub -------------- 将数字替换成'H',参数1表示只替换一个。
import re a = re.sub('\d', 'H', 'this1 is2 why3 we4 play', 1) print(a)
subn ---------- 将数字替换成'H',返回元组(替换的结果,替换了多少次)
import re a = re.subn('\d', 'H', 'this1 is2 why3 we4 play') print(a)
compile ------ 函数将一个字符串编译为字节代码。
import re a = re.compile('\d{3}') # 将正则表达式编译成为一个,正则表达式对象,规则要匹配的是三个数字。 b = a.search('ahd253awd') # 正则表达式对象调用search,参数为待匹配的字符串。 print(b.group())
finditer
import re ret = re.finditer('\d', 'ds3sy4784a') #finditer返回一个存放匹配结果的迭代器 print(ret) # <callable_iterator object at 0x10195f940> print(next(ret).group()) #查看第一个结果 print(next(ret).group()) #查看第二个结果 print([i.group() for i in ret]) #查看剩余的左右结果
findall查询优先级:
a = re.findall('www.(baidu|cnblogs).com', 'www.baidu,com') print(a) b = re.findall('www.(?:baidu|cnblogs).com', 'www.baidu.com') print(b)
我们会发现第一次返回的并不是我们想要的结果,那是因为findall会优先把匹配结果组里内容返回,如果想要匹配结果,取消权限即可。
split的优先级查询:
import re a = re.split("\d+", "this1 is2 why3 we4 play") print(a) b = re.split("(\d+)", "this1 is2 why3 we4 play") print(b)
在匹配部分加上()之后所切出来的结果有所不同;没有括号的没有保留所匹配的项,但是有括号的却能够保留匹配的项。
