python 正则语法
正则的包import re
。
^
匹配模式的^
代表开头。^b
代表是b
开头的。
.
代表任意字符。*
代表任意数量。
^b.*
代表b开头的,任意字符的。
目标搜索字符串
line = "bobby123"
匹配模式
regex_str = "^b.*"
re
的match
函数,第1参数:目标字符串,第2参数:匹配模式。
$
匹配模式的$
代表结尾。
3$
表示必须是以3
结尾的。
.*3$
代表以3
结尾,前面是任意字符串。
贪婪、()、?
匹配模式?
是非贪婪模式。
目标字符串 line = "boooooooobby123"
需要把一串o
前后紧邻的两个b
包含的字符串提取出来。
匹配模式
regex_str = ".*(b.*b).*"
注意这里是提取匹配字符串中子集(b.*b)
import re
line = "boooooooobby123"
regex_str = ".*(b.*b).*"
match_obj = re.match(regex_str, line)
if match_obj:
print(match_obj.group(1))
最后得到的
bb
因为非贪婪模式,是从后往前、从右往左匹配。所以找到bby123
前两位。
非贪婪模式,就是加上?
,从左边开始匹配。
regex_str = ".*?(b.*b).*"
得到
boooooooobb
因为后面也是贪婪模式。所有b
都提取。
如果只要boooooooob
就是匹配中,后面的b前面也加?
。遇到后面第一个b
就返回。
regex_str = ".*?(b.*?b).*"
+
目标字符串
line = "boooooooobaaasdboooooooobbaaaby123"
匹配模式
regex_str = ".*(b.+b).*"
也是从后面匹配。
+
代表至少出现1次。
{1} {2,5} {2,}
{1}
代表出现不多不少就1次。
{2,5}
出现最少两次,最多5次。
|
或
import re
line = "bobby123"
regex_str = "bobby|bobby123"
match_obj = re.match(regex_str, line)
if match_obj:
print(match_obj.group(1))
会报错。因为group对应子集。匹配模式regre_str
中没有括号代表的子集。把括号加上去。
regex_str = "(bobby|bobby123)"
得到
bobby
如果是
regex_str = "(bobby123|bobby)"
得到
bobby123
(())
先提外层座位group(1)
,然后才是group(2)
的内层。
line = "boobby123"
regex_str = "((bobby|boobby)123)"
match_obj = re.match(regex_str, line)
if match_obj:
print(match_obj.group(1))
得到
boobby123
[]
1 任一字符
中括号表示其中任一一个都可以。[abcd]
是a, b, c, d中任何一个都可以。
import re
line = "boobby123"
regex_str = "([abcd]oobby123)"
match_obj = re.match(regex_str, line)
if match_obj:
print(match_obj.group(1))
得到
boobby123
2 区间
另外比如电话号码18782902222
。
regex_str = "1[48357]"
第一位是1
,第二位是[48357]
数字中的任何一位。可以是13几、18几等等,但不可以是12几。
中括号还可以表示区间[0-9]
,代表0到9中的数字。{0}
是9位数字。
line = "18782902222"
regex_str = "(1[48357][0-9]{9})"
3 不等于
import re
line = "18sssssssss"
regex_str = "(1[48357][^1]{9})"
match_obj = re.match(regex_str, line)
if match_obj:
print(match_obj.group(1))
18sssssssss
中括号中组合起来
line = "你_好"
regex_str = "(你[A-Za-z0-9_]好)"
你_好
\s \S
\s
空格
line = "你 好"
regex_str = "(你\s好)"
你 好
\S
不为空格
如果要多个
line = "你很sww好"
regex_str = "(你\S+好)"
你很sww好
\w
\w
匹配包括下划线的任何单词字符,但不包含标点符号如',',它等价于[A-Za-z0-9_];
\W
相反,代表与\w
相反的字符。
\u4E00-\u9FA5
[\u4E00-\u9FA5]
只提取汉字。
import re
line = "你好w"
regex_str = "([\u4E00-\u9FA5]+)"
match_obj = re.match(regex_str, line)
if match_obj:
print(match_obj.group(1))
你好。
regex_str = ".*([\u4E00-\u9FA5]大学)"
regex_str = ".*([\u4E00-\u9FA5]+大学)"
这两个都是只得到:
京大学
因为贪婪模式,右边开始有了就可以了。
regex_str = ".*?([\u4E00-\u9FA5]+大学)"
得到
南京大学
加上?
,从左到右。
regex_str = ".*?(\d{4})年"
?
取消非贪婪
或者可以指定4位数
regex_str = ".*(\d{4})年"