【问题标题】:python regex capture groupspython 正则表达式捕获组
【发布时间】:2017-10-09 21:01:47
【问题描述】:

我正在尝试编写一个匹配数字或数字和尾随字符串的正则表达式模式。所以 ma​​tch 应该输出:

Matching "string100":      [('100', '')]
Matching "string900_TYPE": [('900', 'TYPE')]

但相反,我得到:

Matching "string100":      [('100', '')]
Matching "string900_TYPE": [('900', ''), ('', 'TYPE')]

想法是将数字作为元组中的第一项,将“TYPE”作为第二项,这样我就可以轻松确定元组中是否存在“TYPE”(第二个元组项为空--> '')。

代码:

import re


stringList = ["string100", "string900_TYPE"]
pattern = r"(\d{3})|\w(TYPE)"

for string in stringList:
    match = re.findall(pattern, string)
    print('Matching "' + string + '":\t', match)

提前致谢。

【问题讨论】:

  • 像这样:(\d{3})(?:_(\w+))?。不要使用交替,描述完整的字符串。
  • @CasimiretHippolyte:做到了。谢谢!
  • 该模式实际上可以简化为+(\d{3})_?(\w+)?,这需要更少的正则表达式引擎步骤。是否有任何理由在子组(\w+) 周围使用非捕获组?
  • 如果你使用(\d{3})_?(\w+)?(注意不能以+开头)那么你也可以匹配123_(\d{3})(?:_(\w+))? 在这里是最好的,因为 (?:_(\w+))? 使整个模式序列可选。
  • + 一定是不知何故溜进来了……不过,123_ 似乎没有被捕获。

标签: python regex capture-group


【解决方案1】:

(\d{3})(?:_(\w+))?会成功的。 (感谢@Casimir et Hippolyte)

它也比使用像(\d{3})_?(\w+)? 这样更简单的模式更健壮(感谢@Wiktor Stribiżew)

【讨论】:

    猜你喜欢
    • 2019-01-12
    • 2019-03-17
    • 2018-07-21
    • 2021-01-30
    • 1970-01-01
    • 2018-03-11
    • 1970-01-01
    相关资源
    最近更新 更多