为何两个正则表达式一匹配一不匹配?求技术解析(附Python示例)
为啥这两个Python正则一个成功一个失败?
咱来拆解一下这两个正则的逻辑,结合你的测试字符串'Prompt: \n',就能明白差异啦!
首先先看你的两个测试代码:
示例1(匹配成功):
>>> a = 'Prompt: \n' >>> b = re.compile('Prompt:[ \t]?(?!\n)') >>> re.search(b, a) <_sre.SRE_Match object; span=(0, 7), match='Prompt:'>
示例2(匹配失败):
>>> a = 'Prompt: \n' >>> b = re.compile('Prompt:[ \t]+(?!\n)') >>> re.search(b, a) >>>
关键差异在量词:? vs +
这两个正则的核心区别就在[ \t]后面的量词:
[ \t]?:表示匹配0次或1次空格/制表符,属于“可选匹配”,可以选择不匹配任何空白字符。[ \t]+:表示匹配1次或多次空格/制表符,属于“强制匹配”,必须至少匹配一次空白字符,不能省略。
结合负向预查(?!\n)分析匹配过程
两个正则最后都有(?!\n),这是负向预查:它会断言当前位置的下一个字符不是换行符,如果是换行符,整个匹配就直接失败。
示例1的匹配逻辑:
测试字符串结构是:Prompt: → 空格 → 换行。
正则Prompt:[ \t]?(?!\n)有两条匹配路径:
- 尝试匹配
Prompt:+ 空格:此时匹配完空格后,下一个字符是换行符,(?!\n)断言失败,这条路径走不通。 - 选择不匹配空白字符(也就是
[ \t]?匹配0次):此时匹配停在Prompt:的末尾,下一个字符是空格(不是换行符),(?!\n)断言成立!所以整个正则匹配成功,匹配结果就是Prompt:。
示例2的匹配逻辑:
正则Prompt:[ \t]+(?!\n)要求必须匹配至少一次空白字符:
它只能匹配Prompt: + 空格,此时匹配完空格后,下一个字符是换行符,(?!\n)断言直接失败,而且没有其他路径可选(因为+不能匹配0次),所以整个正则找不到任何匹配,返回None。
内容的提问来源于stack exchange,提问作者lpiner
相关产品推荐
相关产品推荐

