获取匹配的数字以及结果

时间:2013-02-04 00:59:33

标签: python regex

我有这个正则表达式:

a_list = re.compile(r'\(\d+\)\s*\n').split(content)

最终将线路与(数字)匹配起来很有用,但我也需要得到这个数字。

我该怎么做?

感谢。

2 个答案:

答案 0 :(得分:2)

regular expressions documentation for Python所述,正则表达式上的split方法将正则表达式的所有匹配项处理的字符串拆分。现在,你的正则表达式捕获所有在末尾有数字的匹配并在该匹配上分割字符串。所以a_list包含每行中包含数字的所有内容,除了数字及其周围的括号(和可选空格)。

假设您不想拆分所有换行符(仅通过制作正则表达式'\n'),您可以使用negative lookbehind仅捕获与正则表达式匹配的正则表达式匹配的正则表达式,但不包括结果中第二个正则表达式的匹配项。其格式为(?<!x)y,当且仅当x短语正在进行时,才会捕获y的所有实例,但x短语不会随之包含。

在这种情况下使用负向lookbehind的唯一问题是它需要匹配固定数量的字符,但是你有\d+,可以是任意数量的字符。幸运的是,您可以放弃+以及前导\(,以便检查正则表达式模式之前是否至少有一个数字,以便我们只检查{{1 }};这是有效的,因为我们不关心该行是以\d\)还是(10000)结尾。

不幸的是,这会导致捕获(1)之类的行,这与您最初使用的(abc123)正则表达式不匹配。如果您需要确保行以包含多位数字的括号结尾,则可能必须使用多个正则表达式操作。

这确实留下了\(\d+\)的问题,所以你有两个选择。如果你知道最后会有多少个空格,你可以创建一个或表达式,例如: \s*,或者您可以在匹配中添加(\d|\d\s)与换行符,从而删除任何尾随空格。

假设您采用后一个选项,您的示例将看起来像\s*,这将导致a_list包含所有包含最后一个数字的行,以及数字本身(及其周围的括号)

答案 1 :(得分:2)

使用split函数可能需要后视断言,遗憾的是后视需要固定宽度模式(这就是@Thunderforge尝试过的)。我的解决方案使用findall

re.findall(r'(.*?\(\d+\))\s*\n', content, re.S)

注意:

  • flag re.S生成'。'匹配任何角色,包括一个 换行
  • .*?表示非贪婪的比赛

但这种解决方案仍有缺陷。如果content不以数字和“\ n”结尾,则最后一部分将被丢弃。我们可以通过列表推导或生成器表达来解决这个问题,即:

[i or j for i, j in re.findall(r'(.*?\(\d+\))\s*\n|(.+)', content, re.S)]

或:

(i or j for i, j in re.findall(r'(.*?\(\d+\))\s*\n|(.+)', content, re.S))