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

Python 将特定模式与正则表达式匹配,python,regex,string,Python,Regex,String,我必须做一个正则表达式来匹配这种模式 这里有一个例子 JK+6.00,PP*2,ZZ,GROUPO 每个小组都有一场比赛,比如 匹配1 JK + 六点 第二场比赛 聚丙烯 * 二, 第三场比赛 ZZ 第四场比赛 GROUPO 所以用逗号分隔的块 (2至12个大写字母)[可选(+或*)和a(正数0[.0[0]] 此块成功地解析了模式 (?P<block>(?P<subject>[A-Z]{2,12})(?:(?P<operation>\*|\+)

我必须做一个正则表达式来匹配这种模式 这里有一个例子

JK+6.00,PP*2,ZZ,GROUPO

每个小组都有一场比赛,比如

匹配1

  • JK
  • +
  • 六点
第二场比赛

  • 聚丙烯
  • *
  • 二,
第三场比赛

  • ZZ
第四场比赛

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

此块成功地解析了模式

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

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

(?P<value>\d+(?:.?\d{1,2})?)
(?P\d+(?:?\d{1,2})?)
所有可选操作部分(内的值)

(?:(?P\*\+)(?P\d+(?:?\d{1,2}))?
但是,如果字符串与模式不完全匹配,则正则表达式必须失败 这就是问题所在

我试过了,但没用

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


另外,我使用Python re

我猜这就是您所寻找的模式:

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

如果是这样的话,这个正则表达式会起作用:

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


演示:

我个人会选择两步解决方案,首先检查整个字符串是否符合您的模式,然后提取您想要的组

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

我也对你的模式做了一些调整,使之成为
(?:(?)(?:(?*++])(?)(?p\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())
重新导入
str='JK+6.00,PP*2,ZZ,GROUPO'
全模式=r'^(?[A-Z]{2,12}(?:[*+]\d+(?:\。\d{1,2})?(?:,|$)*$
提取模式=r'(?:(?:(?*+)(?:\。\d+(?:\。\d{1,2}))
如果是完全匹配(完全匹配模式,str):
对于re.finditer中的匹配(提取\u模式,str):
打印(match.groups())

你在寻找什么模式?它是
(2个不同的字母)+(时间戳),(2个相同的字母)*(1个数字),(2个相同的字母),(一个字符串)
?是逗号分隔的(2到12个大写字母)[opt.(+或*)和一个数字]看看我做的,它接受正确的信息,但是如果模式是wrong@Misterfrederx你测试了什么?是的,这绝对是一个解决方案,我不知道为什么我以前不这么想!也谢谢你的优化。你知道我做的正则表达式为什么不起作用吗?我定义了“block”组谁起作用,那么为什么^block(,block)*$不?mmmm因为它是一个反向引用,所以它尝试再次匹配文本匹配,而不是模式。
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())