正则表达式入门

正则表达式,又称规则表达式。(英语: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就被排除了

你可能感兴趣的:(正则表达式入门)