【问题标题】:python regex - how to create and reference arbitrary, unknown number of groupspython regex - 如何创建和引用任意数量未知的组
【发布时间】:2016-07-23 02:23:24
【问题描述】:

我有一个由空格分隔的文本值组成的文本文件:

a: b c d e f g
h: i j k
l:
m: n

我不知道这些值中有多少——; 的右边——我会先验的。

我想在正则表达式中使用Python groups 以便能够引用每个捕获。

GnuATgtRE = re.compile(br'^\r\n(?P<target>.+): (?P<deps>.*)\r\n# Implicit rule search has', re.MULTILINE)

目前,<target> 引用分号左侧的项目,<deps> 引用右侧的一个字符串中的所有内容。

我不知道每个target 会有多少个deps

语法(?P<text>) is used to create a group which can be used to reference a specific captured sub-regex

例如,对于第 1 行

match_obj.group('target') = a match_obj.group('deps') = b c d e f g

第 2 行:

match_obj.group('target') = h match_obj.group('deps') = i j k

问题

在我执行match = GnuATgtRE.search(string) 之后,我希望能够通过match.group('some_text') 引用每个空格分隔的dep

问题是我不知道是否有办法创建任意数量的未命名组。

对于第 1 行,我希望能够说 match.group('<5>') 并返回 d

对于第 2 行,match.group('<5') 应该返回 `` 因为只有 5 个字母。

【问题讨论】:

  • 它真的是一个任意数字,还是有一定的限制(例如,10 或 100)?此外,您可能会在此处使用pyparsing 或其他更强大的解析器。
  • 为什么不能在空间上拆分第 2 组?
  • @cxw 这很随意。这是来自make 的输出。需要明确的是,我知道我可以这样做 matchObj.group('deps').split() 。 . .嗯。我想我刚刚解决了我的问题。
  • 我会选择target, deplist = line.strip().split(':'),然后是deps = deplist.strip().split()...没有理由用正则表达式不必要地复杂化...
  • 我正在使用mmap,它只能使用字节数组字符串进行正则表达式搜索。

标签: python regex


【解决方案1】:

this answer

大多数或所有常用的正则表达式引擎,尤其包括那些基于 PCRE 语法的引擎(如 Python 的),在编写正则表达式时,根据左括号的数字索引标记它们的捕获组。所以不,您不能单独使用捕获组从字符串中提取任意数量可变的子序列。

更好的解决方案是在一行上x: 之后的所有内容上调用 line.split()。

【讨论】:

  • Regex 应该很少是您尝试进行文本处理的第一件事。 +1 拆分。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-03-21
  • 2021-02-10
  • 1970-01-01
  • 1970-01-01
  • 2018-02-20
  • 2015-09-03
相关资源
最近更新 更多