【问题标题】:python finditer get start end of capture group [duplicate]python finditer获取捕获组的开始结束[重复]
【发布时间】:2021-11-20 22:22:15
【问题描述】:

我正在尝试为使用re 中的finditer() 方法找到的每个组捕获捕获组的开始和结束。

例如:

strng = 'move 12345-!'
matches = re.finditer('move ([0-9]+).*?', strng)
for each in matches:
    print(*each.groups())
    print(each.start(), each.end())

这将产生开始和结束索引位置,但是是匹配的模式,而不是特定的捕获组。我本质上想始终捕获数字,因为这会改变。 move 这个词将始终是一个锚点,但我不想将它包含在位置中,因为我需要捕获在文本文档中找到的数字的实际位置,以便我可以对找到的每个数字进行切片.

完整的文档可能是这样的:

move 12345-!
move 57496-!
move 96038-!
move 00528-!

我会捕获57496 开始/结束document[17:21],其中 57496 的开始是 17,结束是 21。基础位置用于训练模型。

【问题讨论】:

  • 所以使用start(1)end(1)?

标签: python regex


【解决方案1】:

如果您不希望 move 成为匹配的一部分,您可以将其转换为正向向后看以将其断言到左侧。

那么你可以使用each.group()来获取匹配。

请注意,您可以在模式末尾省略 .*?,因为它是一个非贪婪量词,在该部分之后没有任何内容,并且不会匹配任何字符。

import re

strng = 'move 12345-!'
matches = re.finditer('(?<=move )[0-9]+', strng)
for each in matches:
    print(each.group())
    print(each.start(), each.end())

输出

12345
5 10

【讨论】:

    【解决方案2】:
    >>> import re
    >>> strng = "move 12345-!"
    >>> matches = re.finditer('move ([0-9]+).*?', strng)
    >>> for each in matches:
        print(each.group(1))
        print(each.start(1), each.end(1))
    
        
    12345
    5 10
    >>> 
    

    【讨论】:

      猜你喜欢
      • 2020-05-31
      • 1970-01-01
      • 2018-11-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-05
      相关资源
      最近更新 更多