Динамическое именование групп в регулярных выражениях Python - PullRequest
1 голос
/ 07 января 2010

Есть ли способ динамически обновлять имя группы регулярных выражений в Python?

Например, если текст:

person 1: name1
person 2: name2
person 3: name3
...
person N: nameN

Как бы вы назвали группы «person1», «person2», «person3», ... и «personN», не зная заранее, сколько там людей?

Ответы [ 4 ]

2 голосов
/ 07 января 2010

Нет, но вы можете сделать что-то вроде этого:

>>> import re
>>> p = re.compile('(?m)^(.*?)\\s*:\\s*(.*)$')
>>> text = '''person 1: name1
person 2: name2
person 3: name3
...
person N: nameN'''
>>> p.findall(text)

выход:

[('person 1', 'name1'), ('person 2', 'name2'), ('person 3', 'name3'), ('person N', 'nameN')]

Краткое объяснение:

(?m)     # enable multi-line mode
^        # match the start of a new line
(.*?)    # un-greedily match zero or more chars and store it in match group 1
\s*:\s*  # match a colon possibly surrounded by space chars
(.*)     # match the rest of the line and store it in match group 2
$        # match the end of the line

Ссылки

1 голос
/ 07 января 2010

Судя по вашему принятому ответу, нет необходимости в регулярном выражении

p="""
person 1: name1
person 2: name2
person 3: name3
person N: nameN
"""

ARR=[]
for item in p.split("\n"):
    if item:
        s=item.split(":")
        ARR.append(s)
print ARR

выход

$ ./python.py
[['person 1', ' name1'], ['person 2', ' name2'], ['person 3', ' name3'], ['person N', ' nameN']]
1 голос
/ 07 января 2010

именованные группы захвата и пронумерованные группы (\ 1, \ 2 и т. Д.) Не могут быть динамическими, но вы можете добиться того же с помощью findall:

re.findall (pattern, string [, flags])

Возвращает все неперекрывающиеся совпадения шаблона в строке в виде списка строки. Строка сканируется слева направо, и совпадения вернулся в найденном порядке. Если один или больше групп присутствуют в шаблон, вернуть список групп; этот будет список кортежей, если шаблон имеет более одной группы. пустой совпадения включены в результат если они не касаются начала другой матч.

0 голосов
/ 07 января 2010

Регулярные выражения в Python (и я вполне уверен, что это верно для регулярных выражений в целом) не допускают произвольного числа совпадений. Вы можете либо захватить повторное совпадение полностью (поместив захватывающие скобки вокруг повторяющейся группы), либо зафиксировать последнее совпадение в серии совпадений (повторив группу захвата). Это не зависит от того, являются ли они именованными или пронумерованными группами захвата.

Вам нужно сделать это программно, перебирая все совпадения в строке, например

for match in re.findall(pattern, string):
    do_something(match)
...