我要制作正则表达式来匹配这种模式 这里有一个例子
JK + 6.00,PP * 2,ZZ,GROUPO
匹配每个组,如
匹配1
匹配2
匹配3
匹配4
所以逗号分隔的块 (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重新
答案 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())
答案 1 :(得分:0)
我猜这是你要找的模式:
(2个不同的字母)+(时间戳),(2个相同的字母)*(1个数字),(2个相同的字母),(一个字符串)
如果是这样的话,这个正则表达式就可以解决问题:
^(\w{2}\+\d{1,2}\.\d{2}),((\w)\3\*\d),((\w)\5),(\w+)$