写点什么

正则表达式

发布于: 2020 年 09 月 17 日
正则表达式





import re
line = "sailor123"
regex_str = "^s.*3$"
if re.match(regex_str,line):
print("yes")



^ 匹配的是以某一串字符串匹配开头的第一个字,在这个例子中是以s开头,中间无视有多少

$ 是对应以3结尾

.* 代表的是前面不管出现多少字符(. 任意字符,*出现任意多次)

+代表前面出现1次

| 代表是或(boobby|sailor)优先匹配字符串前面的一个

{} {9}代表出现9个字符,限定前面的值出现的位数{2,}就是大于等于2次,{2,5}大于等于2 小于等于5

[] 三个用途,[]里面任意一个字符出现就可以1个,比如说[48357]中的数字任意出现一个,;第二个是可以表示区间是[0-9]范围内出现的任意数字,比如说匹配电话号码,regex_str = "(1[48357][0-9]{9})";第三个是[^1]不等于1就可以 ,就是取反

\s 代表字符串中间有空格

\S 字符串中间入了任意一个字符

\w 代表A-Z a-z 0-9 _这些都可以 \W相比\w多了空格

?[\u4E00-\u9FA5]+ 连续出现的汉字

\d 数字

贪婪匹配

line = "boooooooooobby123"
regex_str = ".*(b.*b).*"
match_obj = re.match(regex_str,line)
if match_obj:
print(match_obj.group(1))

正则表达式意思是 1. 贪婪匹配是反向匹配的,从最后开始一个个往前面匹配; 2. 从后往前,前面的忽略到第一个b开始中间的忽略,到第二个b结束,后面的忽略;一个括号可以形成一个group,gourp(1)代表提取第一个括号里面的数字。2. 因此,boooooooooobby123只能提取bb中间的oooo....ooo提取不出来。

非贪婪匹配 ?

regex_str = ".*?(b.*?b).*"

对于任意一个b都需要确定从往右匹配,如果第二个?不加,则第二个b又从后往前找



一个复杂的案列综合一下

line2 = "xxx出生于2001年4月1号"
regex_str = ".*出生于(\d{4}[年/-]\d{1,2}([月/-]\d{1,2}[号]|[月/-]\d{1,2}|[月/-]$|$))"
match_obj = re.match(regex_str,line2)
if match_obj:
print(match_obj.group(1))



发布于: 2020 年 09 月 17 日阅读数: 50
用户头像

一个孤独的撰写者 2020.07.30 加入

主攻云计算、云安全,c++、python、java均有涉猎

评论

发布
暂无评论
正则表达式