Python Regex - 如何获取匹配的位置和值

Posted

技术标签:

【中文标题】Python Regex - 如何获取匹配的位置和值【英文标题】:Python Regex - How to Get Positions and Values of Matches 【发布时间】:2010-09-19 23:59:50 【问题描述】:

如何使用re 模块获取所有匹配项的开始和结束位置?例如,给定模式r'[a-z]' 和字符串'a1b2c3d4',我想获取它找到每个字母的位置。理想情况下,我也想取回比赛的文本。

【问题讨论】:

看看这是否有帮助Match Objects 【参考方案1】:
import re
p = re.compile("[a-z]")
for m in p.finditer('a1b2c3d4'):
    print(m.start(), m.group())

【讨论】:

这不提供匹配中其他组的索引 regex=r'([az])(0-9)' m.start 将用于 group(),而不是 group(1)跨度> @StevenWernerCS start() 可以接受组号,所以如果你想要第 n 组的索引,请使用 start(n) @hi-angel 是的,看看我去年的回答就是这样做的【参考方案2】:

取自

Regular Expression HOWTO

span() 在单个元组中返回开始和结束索引。由于 match 方法只检查 RE 是否在字符串的开头匹配, start() 将始终为零。但是 RegexObject 的搜索方法 实例扫描字符串,因此匹配可能不会从零开始 在那种情况下。

>>> p = re.compile('[a-z]+')
>>> print p.match('::: message')
None
>>> m = p.search('::: message') ; print m
<re.MatchObject instance at 80c9650>
>>> m.group()
'message'
>>> m.span()
(4, 11)

将其与:

在 Python 2.2 中,也可以使用 finditer() 方法,将 MatchObject 实例的序列作为迭代器返回。

>>> p = re.compile( ... )
>>> iterator = p.finditer('12 drummers drumming, 11 ... 10 ...')
>>> iterator
<callable-iterator object at 0x401833ac>
>>> for match in iterator:
...     print match.span()
...
(0, 2)
(22, 24)
(29, 31)

你应该能够按照以下顺序做某事

for match in re.finditer(r'[a-z]', 'a1b2c3d4'):
   print match.span()

【讨论】:

你可以像re.search(r'abbit', "has abbit of carrot").span(0)一样使用它——(4, 9) span() 返回的“结束索引”类似于 Python 切片表示法中的“停止”,因为它上升到但不包括该索引;见here。【参考方案3】:

对于 Python 3.x

from re import finditer
for match in finditer("pattern", "string"):
    print(match.span(), match.group())

对于字符串中的每个命中,您将获得\n 分隔元组(分别包含匹配的第一个和最后一个索引)和匹配本身。

【讨论】:

【参考方案4】:

请注意,跨度和组是为正则表达式中的多个捕获组编制索引

regex_with_3_groups=r"([a-z])([0-9]+)([A-Z])"
for match in re.finditer(regex_with_3_groups, string):
    for idx in range(0, 4):
        print(match.span(idx), match.group(idx))

【讨论】:

谢谢,这已被证明非常有用,而且似乎被埋没了。此外,如果有人需要这个:使用命名捕获组时,可以使用 .re.groupindex 找到组的索引,然后使用您概述的方法从那里找到相应的跨度 4 来自哪里? @RadioControlled number_of_known_groups_in_the_regex + 1,因为范围是 [start,end) 不包括 end @StevenWernerCS 所以它不能推广到组数未知的情况......

以上是关于Python Regex - 如何获取匹配的位置和值的主要内容,如果未能解决你的问题,请参考以下文章

python regex如何避免匹配多个分号?

使用 regex_search 获取所有匹配项的索引?

无法在单行 oracle 中获取所有匹配的 regex_substr

JavaScript之正则匹配索引RegExpmatchAllreduceconcattoStringsplitincludesString/d

std::regex,匹配字符串的开始/结束

Python regex - 匹配仅包含 A、B 或 C 的单词