将特定模式与正则表达式匹配

时间:2016-11-11 15:02:51

标签: python regex string

我要制作正则表达式来匹配这种模式 这里有一个例子

JK + 6.00,PP * 2,ZZ,GROUPO

匹配每个组,如

匹配1

  • JK
  • +
  • 6.00

匹配2

  • PP
  • *
  • 2

匹配3

  • ZZ

匹配4

  • GROUPO

所以逗号分隔的块 (2到12个所有大写字母)[可选(+或*)和a(正数0 [.0 [0]])

此块成功解析模式

(?P<block>(?P<subject>[A-Z]{2,12})(?:(?P<operation>\*|\+)(?P<value>\d+(?:.?\d{1,2})?))?)

我们有主题组

(?P<subject>[A-Z]{2,12})

(?P<value>\d+(?:.?\d{1,2})?)

所有可选操作部分(值内)

(?:(?P<operation>\*|\+)(?P<value>\d+(?:.?\d{1,2})?))?

但是如果字符串与模式不完全匹配,则正则表达式必须失败 这就是问题

我尝试了这个但是不起作用

^(?P<block>(?P<subject>[A-Z]{2,12})(?:(?P<operation>\*|\+)(?P<value>\d+(?:.?\d{1,2})?))?)(?:,(?P=block))*$

有什么建议吗?

PS。我使用Python重新

2 个答案:

答案 0 :(得分:2)

我亲自前往两步解决方案,首先检查整个字符串是否适合您的模式,然后提取您想要的组。

对于整体检查,您可能希望使用^(?:[A-Z]{2,12}(?:[*+]\d+(?:\.\d{1,2})?)?(?:,|$))*$作为模式,其基本上包含您的模式,(?:,|$)以匹配分隔符和锚点。

我还将你的模式稍微调整为(?P<block>(?P<subject>[A-Z]{2,12})(?:(?P<operation>[*+])(?P<value>\d+(?:\.\d{1,2})?))?)。我已在您的操作模式中将(?:\*|\+)替换为[+*],并在您的值模式中将\.替换为.?

(非常基本的)python实现看起来像

import re
str='JK+6.00,PP*2,ZZ,GROUPO'
full_pattern=r'^(?:[A-Z]{2,12}(?:[*+]\d+(?:\.\d{1,2})?)?(?:,|$))*$'
extract_pattern=r'(?P<block>(?P<subject>[A-Z]{2,12})(?:(?P<operation>[*+])(?P<value>\d+(?:\.\d{1,2})?))?)'
if re.fullmatch(full_pattern, str):
    for match in re.finditer(extract_pattern, str):
        print(match.groups())

http://ideone.com/kMl9qu

答案 1 :(得分:0)

我猜这是你要找的模式:

  

(2个不同的字母)+(时间戳),(2个相同的字母)*(1个数字),(2个相同的字母),(一个字符串)

如果是这样的话,这个正则表达式就可以解决问题:

^(\w{2}\+\d{1,2}\.\d{2}),((\w)\3\*\d),((\w)\5),(\w+)$

演示:https://regex101.com/r/8B3C6e/2