我必须制作一个正则表达式来精确匹配这种模式 举个例子
JK+6.00,PP*2,ZZ,GROUPO
为每个组匹配
匹配 1
- JK
- +
- 6.00
匹配 2
- PP
- *
- 2
匹配 3
- ZZ
第 4 场比赛
- 集团
所以逗号分隔的 block (2 到 12 个全部大写字母)[可选(+ 或 *)和一个(正数 0[.0[0]])
这个 block 成功解析了模式
(?P<block>(?P<subject>[A-Z]{2,12})(?:(?P<operation>\*|\+)(?P<value>\d+(?:.?\d{1,2})?))?)
我们有主题组
(?P<subject>[A-Z]{2,12})
值(value)
(?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))*$
有什么建议吗?
附言。我用 Python 重新
最佳答案
我个人会采用两步解决方案,首先检查整个字符串是否符合您的模式,然后提取您想要的组。
对于整体检查,您可能需要使用 ^(?:[A-Z]{2,12}(?:[*+]\d+(?:\.\d{1,2})?)?(?:,|$))*$
作为一个模式,它基本上包含你的模式,(?:,|$)
以匹配定界符和 anchor 。
我也稍微调整了你的模式,到(?P<block>(?P<subject>[A-Z]{2,12})(?:(?P<operation>[*+])(?P<value>\d+(?:\.\d{1,2})?))?)
.我已经替换了 (?:\*|\+)
与 [+*]
在你的操作模式和\.
与 .?
在你的值(value)模式中。
(非常基本的)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())
关于python - 将特定模式与正则表达式匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40550703/