Python 无法使用或匹配正则表达式中的特定模式

Python 无法使用或匹配正则表达式中的特定模式,python,regex,Python,Regex,这是我的正则表达式: (M|D|MD|A|AM|AD|AMD)?=(0|1|-1|D|A|!D|!A|-D|-A|D\+A)? 它与 M=D M=A M=1 and so on 但这与我的想法不符 M=D+A 我做错了什么?您需要一个组的量词,如: (M|D|MD|A|AM|AD|AMD)?=((?:\+A|0|1|-1|D|A|!D|!A|-D|-A)+) # ^^^ ^^^ 请参阅。 根

这是我的正则表达式:

(M|D|MD|A|AM|AD|AMD)?=(0|1|-1|D|A|!D|!A|-D|-A|D\+A)?
它与

M=D 
M=A
M=1 
and so on
但这与我的想法不符

M=D+A

我做错了什么?

您需要一个组的量词,如:

(M|D|MD|A|AM|AD|AMD)?=((?:\+A|0|1|-1|D|A|!D|!A|-D|-A)+)
#                      ^^^                          ^^^
请参阅。

根据您的实际需要,更简单的正则表达式(如
(\w+)=([-+!\w]+)
和之后的程序检查可能更容易理解。

请参见上的后一个示例。

Regex从左向右移动,不回溯。一旦“或”语句的前一部分得到满足,它就不会再看得更远。因此,您捕获的是较短的字符串,而正则表达式永远不会到达较长字符串所在的'or'语句的结尾。将正则表达式更改为

(M|D|MD|A|AM|AD|AMD)?=(D\+A|0|1|-1|D|A|!D|!A|-D|-A)?
我会成功的。换言之,始终以先捕获较长字符串,然后捕获较短字符串的方式对“或”语句进行排序


我不理解将模式放入非捕获组的必要性(?:\+A | 0 | 1 |-1 | D | A | D |!A |-D |-A)现在我明白了为什么我的简单正则表达式不起作用了