Python Regex - Как получить позиции и значения совпадений - PullRequest
90 голосов
/ 30 октября 2008

Как я могу получить начальную и конечную позиции всех матчей, используя модуль re? Например, учитывая шаблон r'[a-z]' и строку 'a1b2c3d4', я бы хотел получить позиции, в которых он находит каждую букву. В идеале, я бы тоже хотел вернуть текст матча.

Ответы [ 3 ]

115 голосов
/ 30 октября 2008
import re
p = re.compile("[a-z]")
for m in p.finditer('a1b2c3d4'):
    print m.start(), m.group()
45 голосов
/ 30 октября 2008

взято с

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()
14 голосов
/ 05 июля 2017

Для Python 3.x

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

Для каждого попадания в строку вы получите \n разделенных кортежей (содержащих первый и последний индексы соответственно) и само совпадение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...