2013-03-08 30 views
0

我的文字裏的一些文字被分隔:比賽非貪婪正則表達式定界符

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

我有這種模式的許多事件在我的文字。我想從分隔符中提取some text。我怎樣才能用正則表達式來做到這一點?

例如,如果我有這樣的文字:

Lorem存有簡直是印刷排版行業的虛擬文本。 Lorem Ipsum自從十六世紀以來一直是業界標準的虛擬文本,當時一臺未知的打印機採用了一種類型的廚房,並將其製作成{#zzz#}樣本書。它不僅存活了五個世紀,而且還實現了電子排版的飛躍,基本保持不變。它在20世紀60年代通過{#zzz#} {#zzz#}發佈,包含Lorem Ipsum段落的Letraset表單,以及最近使用{#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 2013-03-08 11:47:54

+0

@turtle,請參閱有關使用它獲取子組的更新說明。 – 2013-03-08 11:48:50