Python 具有任意顺序的两个非重复符号的正则表达式
我需要创建与该字符串匹配的正则表达式:Python 具有任意顺序的两个非重复符号的正则表达式,python,regex,Python,Regex,我需要创建与该字符串匹配的正则表达式: AA+1.01*2.01,BB*2.01+1.01,CC *和+的顺序应为任意 我创建了以下正则表达式: ^(([A-Z][A-Z](([*+][0-9]+(\.[0-9])?[0-9]?){0,2}),)*[A-Z]{2}([*+][0-9]+(\.[0-9])?[0-9]?){0,2})$ 但问题是,这个regex+或*可以使用两次,但我只需要一次,因此以下字符串应该匹配: AA+1*2,CC - true AA+1+2,CC - false (n
AA+1.01*2.01,BB*2.01+1.01,CC
*和+的顺序应为任意
我创建了以下正则表达式:
^(([A-Z][A-Z](([*+][0-9]+(\.[0-9])?[0-9]?){0,2}),)*[A-Z]{2}([*+][0-9]+(\.[0-9])?[0-9]?){0,2})$
但问题是,这个regex+或*可以使用两次,但我只需要一次,因此以下字符串应该匹配:
AA+1*2,CC - true
AA+1+2,CC - false (now is true with my regex)
AA*1+2,CC - true
AA*1*2,CC - false (now is true with my regex)
应首先捕获其中一个
[+*]
,然后使用负前瞻
匹配另一个
正则表达式:[A-Z]{2}([+*])(?:\d+(?:\。\d+)?!\1)[+*](?:\d+(?:\。\d+),[A-Z]{2}
说明:
匹配两个大写字母[A-Z]{2}
捕获([+*])
或+
中的任意一个*
将数字与可选的小数部分匹配(?:\d+(?:\。\d+)
查找捕获的符号并与另一个匹配。因此,如果先前捕获了(?!\1)[+*]
,则将匹配+
*
将数字与可选的小数部分匹配(?:\d+(?:\。\d+)
匹配,[A-Z]{2}
后跟两个大写字母,
要匹配第一种情况,请使用下面的正则表达式 正则表达式:
(?:[A-Z]{2}([+*])(?:\d+(?:\.\d+)?!\1)[+*](?:\d+(?:\.\d+),+[A-Z]{2}
解释:在第一组中添加了除、CC
之外的整个模式,并通过使用+
匹配一个或多个这样的模式使其变得贪婪
要获得与给定示例匹配的正则表达式(扩展到任意数量的逗号),可以使用:
^(?:[A-Z]{2}([+*])?\d*\.?\d*(?!\1)[+*]?\d*\.?\d*,?)*$
请注意,此示例还允许使用尾随逗号。我不确定你对此能做些什么
如果尾部逗号有问题:
^(?:[A-Z]{2}([+*])?\d*\.?\d*(?!\1)[+*]?\d*\.?\d*,?)*?(?:[A-Z]{2}([+*])?\d*\.?\d*(?!\2)[+*]?\d*\.?\d*?)$
请提供更好的输入和所需输出示例。你所说的没有任何意义。
(?=.*\+)(?=.**)
字符串可以用逗号分开吗?如果逗号的数量有限制?@JaredGoguen不可能,没有限制尝试。如果没有更具体的规范,就很难正确地帮助您。第一个示例与之不匹配,请参见@WiktorStribiżew:我认为OP在那里输入了错误。看看他后面的例子,我不知道是否有打字错误。是的,我们等一下。我有一个正则表达式正确匹配了所有三个,但问题属于我通常不回答的问题。我不懂,但问题属于我通常不回答的问题。你不必这么做,我很奇怪。这会让字符串以一个悬垂的逗号结尾。@WiktorStribiżew注意到,但我添加了一个版本来禁止这种行为。我想在大多数情况下,用一个悬垂的逗号就可以了(但谁知道呢)。