2010-01-07 2 views
1

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

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

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

Как бы вы назвали групп PERSON1 ', 'PERSON2', 'person3', ..., и 'personN', не зная заранее, сколько людей есть?

+0

Что вы на самом деле хотите найти из своего образца текста? – ghostdog74

+0

Я пытаюсь найти имена людей в файле журнала, который также содержит другую информацию, которую я разбираю (дата, идентификатор и т. Д.). Я пытался сделать все это в одном регулярном выражении и в итоге получил словарь пар ключ/значение. – kliao

ответ

1

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

>>> 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 

Ссылки

+0

Пожалуйста, добавьте объяснение своего ответа - что это за регулярное выражение? –

1

именованные группы захвата и пронумерованные группы (\ 1, \ 2, и т.д.) не может быть динамичным, но вы может достичь того же с FindAll:

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

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

0

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

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

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

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

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']] 
Смежные вопросы