正则表达式,具有任意顺序的两个非重复符号

时间:2016-04-07 17:04:46

标签: 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})$

但问题是这个正则表达式+或*可以使用两次,但我只需要它们中的任何一个,所以下面的字符串匹配应该是:

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)

2 个答案:

答案 0 :(得分:0)

首先应捕获[+*],然后使用negative lookahead匹配另一个。

正则表达式: [A-Z]{2}([+*])(?:\d+(?:\.\d+)?)(?!\1)[+*](?:\d+(?:\.\d+)?),[A-Z]{2}

<强>解释

  • [A-Z]{2}匹配两个大写字母。

  • ([+*])捕获+*

  • (?:\d+(?:\.\d+)?)将数字与可选的小数部分匹配。

  • (?!\1)[+*]向前看已捕获的符号并与另一个匹配。因此,如果先前已捕获+,则*将匹配。

  • (?:\d+(?:\.\d+)?)将数字与可选的小数部分匹配。

  • ,[A-Z]{2}匹配,后跟两个大写字母。

<强> Regex101 Demo

要匹配第一个案例AA+1.01*2.01,BB*2.01+1.01,CC,这比先前的模式稍微提升一点,请使用以下正则表达式。

正则表达式: (?:[A-Z]{2}([+*])(?:\d+(?:\.\d+)?)(?!\1)[+*](?:\d+(?:\.\d+)?),)+[A-Z]{2}

说明:在第一组中添加除,CC之外的整个模式,并使用+匹配一个或多个此类模式,使其变得贪婪。

<强> Regex101 Demo

答案 1 :(得分:0)

要获得与您给定示例相匹配的正则表达式,扩展为任意数量的逗号,您可以使用:

^(?:[A-Z]{2}([+*])?\d*\.?\d*(?!\1)[+*]?\d*\.?\d*,?)*$

请注意,此示例还允许使用尾随逗号。我不确定你能做些什么。

Regex 101 Example

如果尾随逗号是个问题:

^(?:[A-Z]{2}([+*])?\d*\.?\d*(?!\1)[+*]?\d*\.?\d*,?)*?(?:[A-Z]{2}([+*])?\d*\.?\d*(?!\2)[+*]?\d*\.?\d*?)$

Regex 101 Example