1、正则表达式
正则表达式又称规则表达式(Regular Expression),是使用单个字符串来描述、匹配某个句法规则的字符串,常被用来检索、替换那些符合某个规则的文本。一个正则表达式通常称为一个模式(Pattern)。例如,Polish/Spanish/Swedish这三个字符串,都可以由(Pol/Span/Swed)ish这个模式来描述。大部分的正则表达式的形式都有以下结构:
1)、选择
竖线 “|” 表示选择,具有最低优先级,例如:center|centre 可以匹配 center 或 centre。
2)、数量限定
字符后的数量限定符用来限定前面这个字符允许出现的个数。最常见的数量限定符包括 “ + ” 、“ * ” 、和 “ ? ”。
3)、匹配
成对的圆括号 “()” 用来定义操作符的范围和优先级,例如:gr(a|e)y等价于 gray|grey , (grand)?father 匹配 father 和 grandfather 。
正则表达式中除上述几个字符外,还使用了一些特殊的方式表示匹配的模式,常用的特殊字符及含义如下所示:
注:上表中 \w 中描述部分有误,正确描述如下所示:
常用特殊字符的优先级,如下所示:
**python中可以通过 re 模块使用正则表达式。**常用的方法如下表所示:
2、re.match函数
re.match(pattern, string, flags=0)
pattern:正则表达式
string:要匹配的字符串
flags:标志位,用来控制正则表达式的匹配方式,如是否区分大小写、多行匹配等。
正则表达式可包含一些可选标志修饰符来控制匹配的pattern 。修饰符被指定为一个可选的标志,多个标志符可以通过按位 OR(|) 来指定。例如:re.M|re.I 被设置成 M 和 I 标志。修饰符说明如下:
re.match 尝试从字符串的起始位置匹配一个pattern ,如果不是起始位置匹配成功的话,match() 就返回一个none.
如果匹配成功,re.match方法返回一个匹配的对象,否则返回none,如下:
# 通过span()可以获取匹配的位置。
lin = 'This is a very cute kitten'
print(re.match('This', lin)) # <re.Match object; span=(0, 4), match='This'>
print(re.match('This', lin).span()) # (0, 4)
print(re.match('cute',lin)) # None , match是从起始位置开始匹配的,匹配不上就返回None
stt = 'kitten is a cute girl'
print(re.match('kitten', stt).span()) # (0, 6)
print(re.match('Kitten', stt, re.I).span()) # (0, 6) re.I 修饰符使得匹配对大小写不敏感
可以 使用group(num) 或 group() 匹配对象函数来获取匹配表达式。
正则表达式中捕获分组的序号(一对括号为一个组),取值范围是1~n(n为捕获分组个数,空表示捕获整个匹配上的字符串)。
示例一:
stt1 = 'kiter is a cute kiter'
# matObj = re.search(r'(.+) is (.*) (.*) .+', stt1, re.M|re.I)
matObj = re.search(r'(.+) is (.*) (.*?) .+', stt1, re.M|re.I)
if matObj:
print("matObj.group() : "+matObj.group())
print("matObj.group(1) : "+matObj.group(1))
print("matObj.group(2) : "+matObj.group(2))
print("matObj.group(3) : "+matObj.group(3))
else:
print("No match!!")
结果:
matObj.group() : kiter is a cute kiter
matObj.group(1) : kiter
matObj.group(2) : a
matObj.group(3) : cute
示例二:
在正则表达式中使用 “ * ” 匹配字符串默认是匹配到字符串的结尾,即“贪婪模式”。如果只想匹配到第一个符合条件的子字符串就停止,则需要切换为 “非贪婪模式” ,方法是在 “ * ” 后面加上 “ ? ” ,如下所示:
stt1 = 'kiter is a cute kiter'
matObj = re.search(r'(.+) is (.*) .+', stt1, re.M|re.I) # 贪婪模式
matObj = re.search(r'(.+) is (.*?) .+', stt1, re.M|re.I) # 非贪婪模式
if matObj:
print("matObj.group() : "+matObj.group())
print("matObj.group(1) : "+matObj.group(1))
print("matObj.group(2) : "+matObj.group(2))
else:
print("No match!!")
结果如下:
matObj.group() : kiter is a cute kiter
matObj.group(1) : kiter
matObj.group(2) : a cute # 贪婪模式结果
matObj.group(2) : a # 非贪婪模式结果
stt2 = '<span>abd</span><span>abb</span>'
# mch = re.match(r'<span>.*</span>', stt2, re.I|re.M) # 贪婪模式
mch = re.match(r'<span>.*?</span>', stt2, re.I|re.M) # 非贪婪模式
if mch:
print('mch.group():' + mch.group())
else:
print('not match!')
结果:
mch.group():<span>abd</span><span>abb</span> # 贪婪模式结果
mch.group():<span>abd</span> # 非贪婪模式结果
以上可见,“贪婪模式” 在正则表达式匹配成功的前提下,尽可能多地匹配;而 “非贪婪模式” 在正则表达式匹配成功的前提下,尽可能的少匹配。两种模式影响的是被量词修饰的子表达式的匹配行为。
3、re.search方法
扫描整个字符串,并返回第一个成功的匹配
stTes = 'industre and industy'
pattern = 'industr{1,}'
p = re.compile(pattern)
match = re.search(p,stTes)
print(match.group(0)) # industr