[英]Match specific pattern with regular expression
我要制作一个正则表达式来匹配这种模式这里的一个例子
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重新编写
我个人会采用两步解决方案,首先检查整个字符串是否适合您的模式,然后提取您想要的组。
对于整体检查,你可能想要使用^(?:[AZ]{2,12}(?:[*+]\\d+(?:\\.\\d{1,2})?)?(?:,|$))*$
作为模式,基本上包含你的模式, (?:,|$)
匹配分隔符和锚点。
我也调整了你的模式, (?P<block>(?P<subject>[AZ]{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())
我猜这是你要找的模式:
(2个不同的字母)+(时间戳),(2个相同的字母)*(1个数字),(2个相同的字母),(一个字符串)
如果是这样的话,这个正则表达式可以解决这个问题:
^(\\w{2}\\+\\d{1,2}\\.\\d{2}),((\\w)\\3\\*\\d),((\\w)\\5),(\\w+)$
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.