【问题标题】:Capturing multiple optional groups in a regex both repeating and non repeating在正则表达式中捕获重复和非重复的多个可选组
【发布时间】:2017-01-12 10:45:28
【问题描述】:

我必须匹配类似于这些的表达式

STAR 13

STAR 13, 23

STAR 1, 2 and 3 and STAR 1

但只捕获数字。 位数未指定。

我试过STAR(?:\s*(?:,|and)\s*(#\d+))+ 但它似乎并没有准确地捕捉到这些术语。 不能添加其他依赖项。仅re 模块。

问题更大,STAR 是另一个已经解决的正则表达式。请不要打扰它,只需将其视为字母组合即可。只需在正则表达式中包含字母 STAR

【问题讨论】:

  • STAR 重要吗?
  • 如果您想使用 1 个正则表达式同时验证和获取子匹配(捕获),请考虑使用 PyPi 正则表达式模块。但是,您的要求不是很明确。
  • 规则是什么?
  • 请提供您尝试过的脚本。
  • 在stackoverflow上阅读How to Ask问题。

标签: python regex


【解决方案1】:

如果您不知道r'[0-9]+' 的位数,请指定1 位或更多位。要捕获所有号码,您可以使用:r'(\d+)'

用一个正则表达式来做:

re.findall("STAR ([0-9]+),? ?([0-9]+)? ?a?n?d? ?([0-9]+)?",a)

[('13', '', '')]

[('13', '23', '')]

[('1', '2', '3'), ('1', '', '')]

两步可能会更简单、更清晰,首先你需要在这样的列表中有变量:

tab = ["STAR 13","STAR 13, 23","STAR 1、2 和 3 以及 STAR 1"]

list = filter(lambda x: re.match("^STAR",x),tab)
list_star = filter(lambda x: re.match("^STAR",x),tab)
for i in list_star:
    re.findall(r'\d+', i)

['13']

['13', '23']

['1', '2', '3', '1']

你只需要在my_digit += re.findall(r'\d+', i)之后把它放在一个新的列表中

在 1 行中:

import functools
tab = ["STAR 13","STAR 13, 23","STAR 1, 2 and 3 and STAR 1"]
digit=functools.reduce(lambda x,y: x+re.findall("\d+",y),filter(lambda x: re.match("^STAR ",x),tab),[])

['13', '13', '23', '1', '2', '3', '1']

【讨论】:

  • 但这不会匹配整个表达式。我希望它匹配整个表达式,但只捕获数字。
  • 查看下面的编辑,它不是你想要的,写出你需要的确切结果。
  • 这不是我要求的。对于您提供的表达式,结果应该是 ['13', '23']。但它与整个字符串不匹配。我希望它匹配整个字符串,但只捕获指定的组。
  • re.findall("STAR ([0-9]+),?([0-9]+)??",message) 这是不是我不明白的好方法第三个表达式中的“3”。我明天会看到,但是您在列表的元组中捕获了您的元素。可能最好分两步完成,以便之后简单使用。
  • 你的答案就在上面。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-09-13
  • 2011-03-11
  • 2017-01-07
  • 2019-12-19
  • 1970-01-01
  • 2011-09-19
  • 1970-01-01
相关资源
最近更新 更多