正则表达式,又称规则表达式。(英语:Regular
Expression,在代码中常简写为regex、regexp或RE),计算机科学的一个概念。正则表达式通常被用来检索、替换那些符合某个模式(规则)的文本。
下面是我自己学习的一些总结。这个真的有毒,前段时间学的,最近过年好久没碰又忘了,想想还是写一篇笔记记录一下
元字符
. 匹配除换行符外的任意字符
\w 匹配字母数字下划线中文
\s 匹配空格
\d 匹配数字
^ 匹配字符串的开始
$ 匹配字符串的结束
上段代码
s ="2222efr43243dsfg4r)_+"
reg1 ="\d" # 匹配全部数字
reg2 ="^\d" # 匹配开头的数字
print(re.findall(reg2, s))
反义字符:
说白了就是元字符反过来就好了,可以一起记
. 匹配除换行符外的任意字符
\W 匹配非字母数字下划线中文
\S 匹配非空格
\D 匹配非数字
限定符
*重复0次到多次
+ 重复1次到多次
? 重复0次到多次
{n} 重复n次
{n,} 重复n次到多次
{m,n} 重复m次到n次
分组匹配
这里用关键词group来进行分组
1,search:search返回的是一个匹配对象 ,调用对象的group方法获得字符串
s =“my qq is 189334423,my post code is 33332”
reg4 ="(\d{9}.*(\d{5}))"
print(re.search(reg4, s))
group里面为空或者为1,返回的结果是一样的
print(re.search(reg4, s).group())
print(re.search(reg4, s).group(1))
print(re.search(reg4, s).group(2))
2, match: 匹配开头
s =“hellohello”
reg5 =“hello”
print(re.match(reg5, s,re.I).group())
总结:
findall 匹配所有
match 匹配开头(必须出现在字符串第一个位置)
search 匹配第一个(可以出现任意位置,只要是第一个就好)
贪婪与非贪婪
贪婪:尽可能多的匹配
非贪婪:尽可能少的匹配
非贪婪符可以用在*,?,+的后面
*? 重复1次
?? 重复0次
+? 重复0次
代码如下:
s =“greedyaiiii”
reg1 =“greedyai*” # 贪婪
print(re.findall(reg1, s)) # 非贪婪
reg2 =“greedyai*?”
print(re.findall(reg2, s))
运行结果为:
[‘greedyaiiii’]
[‘greedya’]
分支条件匹配
关键词:" | "
代码如下:
s =“my phone num=010-11111111 0599-2222222 020-2222222”
reg3 =“0\d{2}-\d{8}|0\d{3}-\d{7}|0\d{2}-\d{7}”
print(re.findall(reg3, s))
运行结果为:
[‘010-11111111’, ‘0599-2222222’, ‘020-2222222’]
捕捉与非捕捉(?:)
非捕捉:不破坏正则表达式的整体性,匹配全部
捕捉:捕捉连续符合正则表达式组内的最后一个组的内容
现在我们有个需求,需要匹配IP地址
正常情况下,我们这么写可以匹配出来
ip ="address code: 128.0.0.1 125.125.125.125 0.0.0.0"
reg4 ="(\d{1,3}\.){3}\d{1,3}"
print(re.findall(reg4, ip))
但是,这里实际的运行结果为 [‘0.’, ‘125.’, ‘0.’]
原因是当分组时,会自动匹配捕捉模式,捕捉是是连续符合正则表达式组内的最后一个组的内容,所以这边匹配的就是每组的第三个
这个时候我们需要用到不捕捉,关键字就是 ?:
ip = "address code: 128.0.0.1 125.125.125.125 0.0.0.0"
reg4 = "(?:\d{1,3}\.){3}\d{1,3}"
print(re.findall(reg4, ip))
这样得出的结果就是:[‘128.0.0.1’, ‘125.125.125.125’, ‘0.0.0.0’]
还有个例子如下:
address ="http://www.baidu.com"
reg5 ="http://(?:w){3}\.[a-z]*\.com"
print(re.findall(reg5, address))
零宽断言
(?=reg) 匹配reg前面的内容
(?<=reg) 匹配reg后面的内容
(?!reg) 匹配后面跟的不是reg的内容
(?
例子如下:
s1 ="hellogreedyailove"
reg6 ="hel{2}o(?=greedyai)"
print(re.findall(reg6, s1))
这里匹配的就是greedyai前面的内容,故结果就是hello
reg7="(?<=greedyai)[a-z]*"
print(re.findall(reg7, s1))
这里匹配的就是greedyai后面的内容,故结果就是hello
reg8="lo(?!greedyai)"
print(re.findall(reg8, s1))
这里返回的是love里面的lo,因为匹配的是后面跟着的不是greedyai的内容,前面hello里的lo后接greedyai
reg9 ="(?
print(re.findall(reg9, s1))
返回的是hello的2个l,因为这里返回的是l前面不是greedyai的内容,那love里的l就被排除了