你如何创建一个能够接受任何角色的模式,但任何后续角色应该与第一个角色相同?例如,ax + bx + x,其中a,b和x可以是任何字符,但'x'字符必须保持不变。 我正在尝试创建一个模式来识别quadratics(ax ^ 2 + bx + c),但我意识到使用我的模式,使用2个不同的字母将匹配模式。 模式:
r"([\d+]*)([\D])\^2\+?\-?([\d+]*)([^\+\-\d])\+?\-?([\d+])+$"
答案 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?
)。
如果您希望事先能够拥有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
如果您需要匹配小数而不仅仅是整数,请将\d+
更改为\d+(?:\.\d+)?
。
^(?:\d+(?:\.\d+)?[+\-*\/^](?:\d+(?:\.\d+)?[+\-*\/^])*)?\D(\D)(?:[+\-*\/^](?:\d+(?:\.\d+)?\1?|\D\1?))*$
请注意,这不会考虑空格,因此如果需要,您必须在\s*
周围撒一些。