python正则表达式学习笔记

^,.,*,$,+

1
2
3
4
5
import re
text = "python"
_str = "^p.*n$"
if re.match(_str, text):
print("ok")

^p指要以p开头,n$指要以n结尾,.可以替换任意字符,*指前面的字符可以出现任意多次,+*区别是+至少出现一次。

(),?

1
2
3
4
5
6
import re
text = "pythonoooppython"
_str = "(.*(p.*p).*)"
obj = re.match(_str, text)
if obj:
print(obj.group(2))

()可以提取子串,也就是提取到的字符串就是括号中的内容。如果将print(obj.group(2))中的2改成1,那么匹配到的就是pythonoooppython。
此代码运行结果是pp,因为默认的是贪婪匹配模式,即从右开始找到pp后结束。如果想要找到pythonooop,如果将代码中的_str = ".*(p.*p).*"改成_str = ".*?(p.*p).*",这样会匹配到pythonooopp,会发现多了一个p,这是因为前面的.*?导致从左向右匹配了第一个p,但是后面的.*p是从右找到的p,所以应该改成_str = ".*?(p.*?p).*",这样匹配到的就是pythonooop。也就是说?可以将贪婪匹配改成非贪婪匹配。

{}

1
2
3
4
5
6
import re
text = "pythonooop1234python"
_str = ".*(p.{4}p).*"
obj = re.match(_str, text)
if obj:
print(obj.group(1))

匹配到的是p1234p,{x}的意思是前一个字符出现x次,{x,}是前一个字符出现至少x次,{x,y}是前一个字符至少出现x次,至多出现y次。

|

1
2
3
4
5
6
import re
text = "pythonpython"
_str = "(python|pythonpython)"
obj = re.match(_str, text)
if obj:
print(obj.group(1))

匹配出来的是python,|是或的意思。

[]

1
2
3
4
5
6
import re
text = "python"
_str = "([abcp]ython)"
obj = re.match(_str, text)
if obj:
print(obj.group(1))

匹配结果是python,[]的意思是括号内的字符只要符合一个就行。
[0-9]表示0~9这十个数字,[^0]表示字符不等于0就可以。
[]内的.就是.,不再具有特殊意义,其他的字符同理。

\s,\S,\w,\W,\d

1
2
3
4
5
6
import re
text = "编 程"
_str = "(编\s程)"
obj = re.match(_str, text)
if obj:
print(obj.group(1))

匹配出来是“编 程”,\s可以匹配空格,\S可以匹配除了空格以外的字符。
\w可以匹配A-Za-z0-9_\W可以匹配除了\w以外的字符。
\d可以匹配数字。

[\u4E00-\u9FA5]

1
2
3
4
5
6
import re
text = "编程"
_str = "([\u4E00-\u9FA5]+)"
obj = re.match(_str, text)
if obj:
print(obj.group(1))

匹配出来是“编程”。[\u4E00-\u9FA5]可以匹配汉字。