本帖最后由 阿奇_o 于 2021-4-12 14:29 编辑
理解的正则的关键是:
0. 此模式 代表 什么字符?
1. 依 此模式 逐个字符、逐个字符 地 匹配,会怎样?到哪个字符停止?
2. 分组,和 不分组,有啥区别?
3. 所谓的“贪婪模式”,和 “非贪婪模式” 到底什么意思? 区别在哪?
import re
line = "Cats are smarter than dogs"
# line_1 = "Cats are smarter than xxxy dogs"
# line_2 = "Cats are smarter than dogs"
matchObj = re.match( r'(.*) are (.*?) .*', line, re.M|re.I)
# 理解 ? 非贪婪模式,到底是什么意思?
# matchObj = re.match( r'(.*) are (.*).*', line, re.M|re.I) # 意思是:? 对前一个正则模式进行匹配次数判断,最多匹配一次,即0次或1次;
# 这里 .* 是 ? 所要判断的 正则模式,.代表任一一个字符,*代表允许有.这样的若干个字符(0个到无限个)
# ? 要判断 .* 的匹配发生次数,.和*的共同作用,使字符串smarter,开始逐个字符匹配出来,
# 但随后遇到了 空格 是 新的正则模式,且只匹配 单个空格符,于是匹配到字符 r 时,.* 的作用,就结束了。
# matchObj = re.match( r'(.*) are (.*)', line, re.M|re.I) # 若没有 空格和随后的匹配模式影响,.*将匹配到最后所有字符(故又叫“贪婪模式”)
matchObj = re.match( r'(.*) are (.*) .*', line, re.M|re.I) # 理解:这里为什么会匹配出 smarter than
# 因为 少了 ? 进行约束,.*的共同作用,可以一直匹配下去,但 你上面说 空格 的影响,为什么它没有在r后的空格停止,而是到了 than的 n 后的空格才停止?
# 因为 随后的还有 匹配模式 r' .*' 的影响,即最后部分,它需要匹配出一个 空格+任意字符若干个 这样的模式, 所以 它是到了 n后停止。
# 你可以尝试 line_2 的字符串,并打印匹配出的字符长度,你会发现 than的n后,还有一个空格。而后部分,必然也有个空格,即 空格+dogs
if matchObj:
print( "matchObj.group() : ", matchObj.group()) # 所有符合正则模式的匹配结果,包括 非分组部分。(没小括号的,即 非分组部分,也匹配出,只是不分组)
print( "matchObj.group(1) : ", matchObj.group(1)) # 匹配到的 分组部分的 第一组结果
print( "matchObj.group(2) : ", matchObj.group(2)) # 匹配到的 分组部分的 第二组结果
# print(len(matchObj.group(2))) # 为什么会是 13 字符?
else:
print( "No match!!" )
|