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

标签 python regex string

我必须制作一个正则表达式来精确匹配这种模式 举个例子

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())

http://ideone.com/kMl9qu

关于python - 将特定模式与正则表达式匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40550703/

相关文章:

c++ - 为什么我不能删除字符串的数字字符?

python - 构造函数参数与方法调用

python - 将 0/1 添加到数据帧行的每一列的所有排列

python - 将 Pandas 系列中的文档术语计数转换为 python 列表

python - 使用进度条进行输出

python - 使用正则表达式查找Python中两个定义标签之间多行字符串的所有出现

python - 删除 - 列中每一行中的字符,但仅当它们位于数字之后时

javascript - 用于日期验证的正则表达式

c - 在 C 中查找字符串长度的问题

c# - 如何使用 linq 在 C# 中过滤字符串以排除所有字母和数字?