一、引言
什么是正则表达式?参考链接https://www.runoob.com/regexp/regexp-intro.htmlhttps://www.runoob.com/regexp/regexp-intro.html作者总结两个关键词:灵活、匹配
为什么要用正则表达式?
二、实例解析
实例来源菜鸟教程
#!/usr/bin/python3
import re
line = "Cats are smarter than dogs"
# .* 表示任意匹配除换行符(\n、\r)之外的任何单个或多个字符
# (.*?) 表示"非贪婪"模式,只保存第一个匹配到的子串
matchObj = re.match( r'(.*) are (.*?) .*', line, re.M|re.I)
if matchObj:
print ("matchObj.group() : ", matchObj.group())
print ("matchObj.group(1) : ", matchObj.group(1))
print ("matchObj.group(2) : ", matchObj.group(2))
else:
print ("No match!!")
正则表达式如下:
r'(.*) are (.*?) .*'
re.match 为起始位置匹配模式
re.M|re.I 为正则表达式修饰符 - 可选标志,满足大小写、多行匹配
(.*?) 为正则表达式模式 其中 () 为一组;. 除换行符外的任意字符;* 匹配0个和多个表达式;? 非贪婪方式。
group 提取分组匹配到的字符串,group()和group(0) 为正则表达式整体匹配结果;group(1)为匹配第一组括号内表达式的结果;以此类推。
三、控制变量法分析正则表达式
r'(.*) are (.*?) .*' 输出如下:
matchObj.group() : Cats are smarter than dogs
matchObj.group(0) : Cats are smarter than dogs
matchObj.group(1) : Cats
matchObj.group(2) : smarter
r'(.*) are (.*?) .' 输出如下:
matchObj.group() : Cats are smarter t
matchObj.group(0) : Cats are smarter t
matchObj.group(1) : Cats
matchObj.group(2) : smarter
r'(.*) are (.*?) ' 输出如下:
matchObj.group() : Cats are smarter
matchObj.group(0) : Cats are smarter
matchObj.group(1) : Cats
matchObj.group(2) : smarter
r'(.*) are (.*?)' 输出如下:
matchObj.group() : Cats are
matchObj.group(0) : Cats are
matchObj.group(1) : Cats
matchObj.group(2) :
r'(.*) are ' 输出如下:
matchObj.group() : Cats are
matchObj.group(0) : Cats are
matchObj.group(1) : Cats
r'(.*) are' 输出如下:
matchObj.group() : Cats are
matchObj.group(0) : Cats are
matchObj.group(1) : Cats
r'(.*) ' 输出如下:
matchObj.group() : Cats are smarter than
matchObj.group(0) : Cats are smarter than
matchObj.group(1) : Cats are smarter than
r'(.*)' 输出如下:
matchObj.group() : Cats are smarter than dogs
matchObj.group(0) : Cats are smarter than dogs
matchObj.group(1) : Cats are smarter than dogs
r'.*' 输出如下:
matchObj.group() : Cats are smarter than dogs
matchObj.group(0) : Cats are smarter than dogs
r'.' 输出如下:
matchObj.group() : C
matchObj.group(0) : C
综上值得注意的是,空格 也是匹配的内容和对象,直接影响整个匹配结果。前面提到“re.match 为起始位置匹配模式”所以起始位字符稍有不匹配情况,将直接返回none。一开始去理解re.match匹配模式在应用中相当不合理,所以建议使用re.search来匹配整个字符串。