正则表达式

2018-09-09  本文已影响0人  StephenZhang01

正则表达式符号(元字符)

'.':通配符。默认匹配除了'\n'以外的任意一个字符(包括字母、符号与数字)。若指定flag DOTALL,则匹配任意字符包括换行。

'^':匹配字符开头,若指定flags MULTILINE,这种也可以匹配上(r"^a","\nabc\neee",flags=re.MULTILINE)

'$':匹配字符结尾。

'[]':匹配中括号中的一个字符

'?':匹配前一个字符0或1次

'*':匹配*号前的字符0次或多次

'+':匹配+号前一个字符1次或多次

'{m}':匹配前一个字符m次

'{m,n}':匹配前一个字符m到n次

'|':匹配|左或|右的字符

'(exp)':分组匹配, 括号内就是一个分组,组号从1开始。\1

'(?:exp)':取消括号内分组,没有分组号。

'\A':只从字符开头匹配

'\Z':匹配字符结尾。

'\d':匹配数字0-9

'\D':匹配非数字

'\w':只匹配[A-Za-z0-9]

'\W':只匹配非[A-Za-z0-9]

'\s':匹配空白字符、\t、\n、\r

'\b':捕捉与特殊字符之间的边界,如re.findall(r'a\b', 'a$')

'*?,+?,??':则是取消贪婪模式,尽量匹配最少的。例如re.findall('<.*?>', 'sdfs')

'(?P<name>exp)':分组匹配,并将<>内的内容作为key,然后与匹配项组成字典,通过key取得匹配的内容。例:a = re.search("(?P[0-9]+)(?P[a-zA-Z]+)",'sdf33232sdf')    a.group('id', 'name')

'(?=exp)':正预测先行断言:表示匹配项后必须是满足exp条件。注意:断言不是分组,所以没有分组号。例:d = "wood boost foo "; re.findall("f(?=ood)", d)

'(?<=exp)':正回顾后发断言:表示匹配项前需要满足exp条件。例:d = "wood boost foo "; re.findall("(?<=w)ood", d)

'(?!exp)':负预测先行断言。表示匹配项后必须不是exp条件。例:d = "123456 "; re.findall("\d{3}(?!\d)", d)


匹配字符串的常用方法

match方法

从头至尾匹配字符,匹配严格

re.match(a,b)

a参数为匹配条件(正则表达式符号);b参数为要匹配字符串

re.match('dsf\d+','dsf1221sdf')

search方法

从头到尾匹配一次,只要匹配到就返回。

re.search(a,b)

a参数为匹配条件(正则表达式符号);b参数为要匹配字符串

例:

a = re.search('\d','sdf123dser')

print(a.group())

findall方法

匹配多次,直到找到所有匹配。并以列表输出。

urls2 = '''https://www.jianshu.com

https://www.baidu.com'''

data3 = re.findall("^(?:http|https).*", urls2, flags=re.M)

print("3: \033[31;1m{}\033[0m\n".format(data3))

finditer方法

返回迭代器,且里面的元素为match对象。使用循环遍历或next取出元素(惰性求值),然后对元素用groups,取分组。

compile方法

words = "Hello world "

cp = re.compile("[a-z]+")

cp.search(words, 2,10)  # 限定匹配区间

split方法

匹配并分割

re.split('分隔字符/规则','分割对象')

例re.split('e','sdfesdfe223')

sub方法

匹配并替换

re.sub("匹配内容","替换内容","匹配对象",count=N)

N为从开头到结尾匹配次数

re.sub('[0-9]+',' ','sdf234dsf34csdfs234sdf',count=1)

subn方法

匹配并替换,最后返回结果与替换次数

re.subn("匹配内容","替换内容","匹配对象",count=N)


flags参数(模式修正符)

re.I:忽略大小写

例:re.search('[a-z]+','sdfASDSAfgds',flags=re.I)

re.M:多行匹配。如果有托字符^或$,则影响每行(行首、行尾)。

re.L:本地化识别匹配。

re.U:根据unicode字符来解析。

re.S:单行匹配:使'.'可以匹配换行符:


贪婪模式与懒惰模式

常规贪婪模式

匹配任意多个字符:.*

懒惰模式

最少匹配任意字符:.*?

例:

a = 'a.*b'

b = 'a.*?b'

c = 'asdf12321bc*^%$b'

re.search(a, c)

re.search(b, c)

上一篇下一篇

猜你喜欢

热点阅读