python正则表达式中的“锁定”字符选择

时间:2017-03-30 19:26:34

标签: python regex

你如何创建一个能够接受任何角色的模式,但任何后续角色应该与第一个角色相同?例如,ax + bx + x,其中a,b和x可以是任何字符,但'x'字符必须保持不变。 我正在尝试创建一个模式来识别quadratics(ax ^ 2 + bx + c),但我意识到使用我的模式,使用2个不同的字母将匹配模式。 模式:

 r"([\d+]*)([\D])\^2\+?\-?([\d+]*)([^\+\-\d])\+?\-?([\d+])+$"

1 个答案:

答案 0 :(得分:0)

对于解析器来说,这可能是一个更好的工作。即使只是为了匹配。但是,如果您坚持使用正则表达式,那么可以通过执行以下操作来完成:

^(?:\d+|\D)(\D)(?:[+\-*\/^](?:\d+\1?|\D\1?))+$

匹配输入如下:

ax
ax+bx+x
ay+ay+y
ax^2+bx+c

通过匹配\D然后捕获后续\D来工作。然后每次找到2个字符时,第二个字符必须是先前匹配的字符(\D\1?)。

Live preview

如果您希望事先能够拥有2+之类的内容。然后它变得有点棘手:

^(?:\d+[+\-*\/^](?:\d+[+\-*\/^])*)?\D(\D)(?:[+\-*\/^](?:\d+\1?|\D\1?))*$

匹配输入如下:

ax
ax+bx+x
ay+ay+y
ax^2+bx+c
2+ax
2+ax+bx
2-1+ax+bx

Live preview

如果您需要匹配小数而不仅仅是整数,请将\d+更改为\d+(?:\.\d+)?

^(?:\d+(?:\.\d+)?[+\-*\/^](?:\d+(?:\.\d+)?[+\-*\/^])*)?\D(\D)(?:[+\-*\/^](?:\d+(?:\.\d+)?\1?|\D\1?))*$

请注意,这不会考虑空格,因此如果需要,您必须在\s*周围撒一些。