Python 模式相同但结果不同

Python 模式相同但结果不同,python,regex,Python,Regex,在RegExr.com的示例部分,有一个2-5个字母回文的代码。在Python中使用完全相同的模式似乎不能像RegExr那样捕获所有结果 Python不会捕获少于4个字符的单词,如“dad”和“555”。代码是这样的 \b(\w)?(\w)\w?\2\1 产生这些不同结果的原因是什么?在Python中,当重复第一个捕获组时,它与一个条件一起工作: \b(\w)?(\w)\w?\2(?(1)\1) (?(1)\1)转换为:如果第一个捕获组成功,请再次匹配第一个捕获组 这些差异很可能是由于正则表达

在RegExr.com的示例部分,有一个2-5个字母回文的代码。在Python中使用完全相同的模式似乎不能像RegExr那样捕获所有结果

Python不会捕获少于4个字符的单词,如“dad”和“555”。代码是这样的

\b(\w)?(\w)\w?\2\1

产生这些不同结果的原因是什么?

在Python中,当重复第一个捕获组时,它与一个条件一起工作:

\b(\w)?(\w)\w?\2(?(1)\1)

(?(1)\1)
转换为:如果第一个捕获组成功,请再次匹配第一个捕获组


这些差异很可能是由于正则表达式引擎对可选的非匹配捕获组的处理方式不同。例如,RegExr在浏览器中使用JavaScript引擎,该引擎将空捕获组视为未定义。当再次尝试在字符串末尾匹配undefined时,它将成功。然而,在Python中,这是不同的,只有在可选捕获组成功的情况下,才能再次成功匹配。这只是实现细节。

看一看您是否还想包含一小段Python代码?i、 e.您是否正在使用
re.match(“\b(\w)?(\w)\w?\2\1”)
?请注意,如果您将问号放在组中,原始正则表达式将以任何形式工作,如您所见。这样,两组在仍然参加比赛的情况下,什么也不能比赛。ECMAScript(JavaScript和ActionScript背后的规范)是我所知道的唯一一种将非参与组视为空组的风格。