2013-03-08 4 views
0

У меня есть текст, где часть текста ограничена:матч нежадным регулярное выражение разделителей

{# xxx #} some text {# zzz #} 

У меня есть много вхождений этого шаблона на протяжении всего моего текста. Я хотел бы извлечь some text из разделителей. Как я могу сделать это с помощью регулярного выражения?

Например, если у меня есть этот текст:

Lorem Ipsum просто манекен текста печати и верстки промышленности. Lorem Ipsum был стандартным фиктивным текстом отрасли с тех пор, как в 1500-х годах, когда неизвестный принтер взял камбуз типа и скремблировал {# xxx #} его, чтобы сделать {# zzz #} типовой экземпляр книги. Он пережил не только пять столетий, но и прыжок в электронный набор, оставаясь практически неизменным. Он был популяризирован в 1960-х годах {# xxx #} с {# zzz #} выпуском листов Letraset, содержащих проходы Lorem Ipsum, а в последнее время с {# xxx #} настольным издательским программным обеспечением, таким как Aldus PageMaker {# zzz #}, включая версии Lorem Ipsum.

Я хотел бы получить список вроде:

[it to make, with, desktop publishing software like Aldus PageMaker] 

Вот мой нерабочим код:

>>> regex = re.compile(r'{# xxx #}.*({# zzz #}).*?')

>>> re.findall(regex, s) {# zzz #}

Я думаю, что мои трудности пытаются крафта регулярное выражение в неживой манере?

ответ

2

Вы можете получить не жадное поведение, просто добавив ? между разделителями. Кроме того, вы не должны иметь .*? в конце. Он ничего не делает. {} являются специальными символами и, вероятно, должны быть экранированы. Наконец, круглые скобки должны быть вокруг той части, которую вы хотите сопоставить. Это дает вам этот шаблон:

regex = re.compile(r'\{# xxx #\}(.*?)\{# zzz #\}') 

Чтобы использовать его, вам нужен цикл, который использует нечто вроде m = re.match, а затем использует m.group(1), чтобы получить первую подгруппу (часть адреса в скобках). Вам нужно использовать цикл, а не findall, потому что вы можете получить только последнее соответствие для подгруппы.

+0

Ничего себе, это невероятно! Почему в итоговое соответствие не входят '{# xxx #}' и '{# zzz #}'? – turtle

+0

@turtle, см. Обновленное объяснение об использовании его для получения подгрупп. – 2013-03-08 11:48:50

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