2013-09-22 2 views
0

Я только учусь питоном и возникают проблемы, выяснить, как создать шаблон регулярного выражения для следующей строкиPython: помочь составлению регулярных выражений шаблона

"...', 'begin:32,12:1:2005-10-30 T 10:45:end', 'begin:33,13:2:2006-11-31 T 11:46:end', '... <div dir="ltr">begin:32,12:1:2005-10-30 T 10:45:end<br>begin:33,13:2:2006-11-31 T 11:46:end<br>..." 

Я пытаюсь извлечь данные между началом: и: завершение для n итераций без получения повторяющихся данных. Я приложил свою текущую попытку.

for m in re.finditer('.begin:(.*),(.*):(.*):(.*:.*):end.', list_to_string(j), re.DOTALL): 
    print m.group(1) 
    print m.group(2) 
    print m.group(3) 
    print m.group(4) 

выход:

begin:32,12:1:2005-10-30 T 10:45:end<br>begin:33 
13 
2 
2006-11-31 T 11:46 

, и я хочу, чтобы это было:

32 
12 
1 
2005-10-30 T 10:45 
33 
13 
2 
2006-11-31 T 11:46 

Спасибо за любую помощь.

ответ

2

.* is жадный, соответствующий по вашему предназначению :end граница. Заменить все .* s ленивый.*?.

>>> s = """...', 'begin:32,12:1:2005-10-30 T 10:45:end', 'begin:33,13:2:2006-11-31 T 11:46:end', '... <div dir="ltr">begin:32,12:1:2005-10-30 T 10:45:end<br>begin:33,13:2:2006-11-31 T 11:46:end<br>...""" 
>>> re.findall("begin:(.*?),(.*?):(.*?):(.*?:.*?):end", s) 
[('32', '12', '1', '2005-10-30 T 10:45'), ('33', '13', '2', '2006-11-31 T 11:46'), 
('32', '12', '1', '2005-10-30 T 10:45'), ('33', '13', '2', '2006-11-31 T 11:46')] 

С измененным рисунком, заставляя одиночные кавычки присутствовать на старте/конце матча:

>>> re.findall("'begin:(.*?),(.*?):(.*?):(.*?:.*?):end'", s) 
[('32', '12', '1', '2005-10-30 T 10:45'), ('33', '13', '2', '2006-11-31 T 11:46')] 
+0

определить «жадный». – darls

+0

@ darls: Читайте о [quantifiers] (http://www.regular-expressions.info/repeat.html). Жадный квантификатор подходит как можно больше, ленивый квантификатор соответствует как можно меньше. –

+0

Я получил его для работы с ". *?" и> begin: ...: end <. Как я могу изменить шаблон для идентификации начала итерации и заканчивая символом? – darls

0

Вы должны сделать части вашего шаблона переменной размера «не жадный ». То есть, чтобы они соответствовали наименьшей возможной строке, а не максимально возможной (по умолчанию).

Попробуйте рисунок '.begin:(.*?),(.*?):(.*?):(.*?:.*?):end.'.

0

Другой вариант Blckknght и Тим Pietzcker является

re.findall("begin:([^,]*),([^:]*):([^:]*):([^:]*:[^:]*):end", s) 

Вместо выбора нежадным расширений, вы используете [^X] означает «любой символ но X» для некоторого X.

Преимущество заключается в том, что он более жесткий: нет возможности получить разделитель в результате, поэтому

'begin:33,13:134:2:2006-11-31 T 11:46:end' 

не будет т, тогда как для Блеккнхта и Тима Пицкера. По этой причине он также, вероятно, быстрее на кромках. Это, вероятно, не важно в реальных условиях.

Недостатком является то, что он более жесткий, конечно.

Предлагаю выбрать тот, который делает более интуитивно понятным, потому что оба метода работают.

Смежные вопросы