Как я могу получить начальную и конечную позиции всех матчей, используя модуль re
? Например, учитывая шаблон r'[az]'
и строку 'a1b2c3d4'
я бы хотел получить позиции, в которых он находит каждую букву. В идеале, я бы тоже хотел вернуть текст матча.
Python Regex - Как получить позиции и значения совпадений
Ответ 1
import re
p = re.compile("[a-z]")
for m in p.finditer('a1b2c3d4'):
print(m.start(), m.group())
Ответ 2
Взято из
span() возвращает как начальный, так и конечный индексы в одном кортеже. Поскольку метод соответствия только проверяет, совпадает ли 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()
Ответ 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))