正则表达式入门导包
import re
常用示例
- 以某个字符串开头
^
- 任意字符
.
就是一个英文的句号
- 任意多次
*
示例
line = "tpr123"
regex_str = "^t.*"
if re.match(regex_str, line):
print("匹配成功")
结果
D:\pythonworkspace\regexp\venv\Scripts\python.exe D:/pythonworkspace/regexp/test/test.py
匹配成功
- 以某个值为结尾
$
示例
line = "tpr123"
regex_str = "^t.*3$"
if re.match(regex_str, line):
print("匹配成功")
结果
D:\pythonworkspace\regexp\venv\Scripts\python.exe D:/pythonworkspace/regexp/test/test.py
匹配成功
示例
line = "tpr123"
regex_str = "^t.*4$"
if re.match(regex_str, line):
print("匹配成功")
无结果
- 非贪婪匹配
?
示例:有一个字符串”line = “tpyyyyyyyppr123” 把 pyyyyyyyp取来出。使用正则表达式的方式。
错误示例:
line = "tpyyyyyyyppr123"
regex_str = ".*(p.*p).*"
match_result = re.match(regex_str, line)
if match_result:
print(match_result.group(1))
运行结果
D:\pythonworkspace\regexp\venv\Scripts\python.exe D:/pythonworkspace/regexp/test/test.py
pp
原因: 正则表达式在匹配的时候是贪婪匹配的,是从字符串的右边开始对比字符串是否符合正则表达式。 因此取出来的就是pp。下面我们要做的就是让他从左右取出来。
示例 :
import re
line = "tpyyyyyyyppr123"
regex_str = ".*?(p.*p).*"
match_result = re.match(regex_str, line)
if match_result:
print(match_result.group(1))
运行结果
D:\pythonworkspace\regexp\venv\Scripts\python.exe D:/pythonworkspace/regexp/test/test.py
pyyyyyyypp
结果还是不符合要求,他把结尾的两个p都取出来了。 是因为 .*p
这个正则也是符合yyyypp的。如果有三个p 也都会匹配出来。
示例
import re
line = "tpyyyyyyypppr123"
regex_str = ".*?(p.*?p).*"
match_result = re.match(regex_str, line)
if match_result:
print(match_result.group(1))
运行结果
D:\pythonworkspace\regexp\venv\Scripts\python.exe D:/pythonworkspace/regexp/test/test.py
pyyyyyyyp
这样结果就符合我们的要求了。
? 的非贪婪模式不只是能把匹配从右开始,还能把当匹配到第一个符合要求的值匹配出来。 就不会在接着匹配了。