2011-09-27 85 views
1

我試圖在Python中編寫正則表達式來提取段落的一部分。正則表達式來提取段落

在下面的段落中,我希望提取的部分是粗體。

建議將提升救助資金,注入資金,銀行和削減 希臘債務說報告。

我正則表達式和輸出如下,

>>> text = 'Proposal will boost bailout fund, inject cash into banks and cut Greek debt says reports.' 
>>> pattern = re.compile(r'(boost bailout)+?([\s\S]*?)(debt)+?') 
>>> print re.findall(pattern, text) 

[('boost bailout', ' fund, inject cash into banks and cut Greek ', 'debt')] 

雖然它提取正確的部分,是不是該萃取被分離成3份在一個元組,而不是隻是一個單一的線如下面?

[('boost bailout fund, inject cash into banks and cut Greek debt')] 

回答

1

從文檔:

如果一個或多個組中存在的格局,迴歸團體名單;如果模式有多個組,這將是一個元組列表。空結果包含在結果中,除非他們觸及另一場比賽的開始。

- http://docs.python.org/library/re.html

如果你想要一個比賽,做:

#!/usr/bin/env python 
import re 
text = 'Proposal will boost bailout fund, inject cash into banks and cut Greek debt says reports.' 
pattern = re.compile(r'boost bailout[\s\S]*?debt') 
print re.findall(pattern, text) 
+0

再次感謝!很多要學習,很多要學習。 :) – Ted

+0

不客氣,再一次,特德! :) –

1

使用

re.search(reg, text).group(0) 

或(你的情況):

pattern.search(text).group(0) 
0

你的模式是不正確的:

(boost bailout)+意味着:字符串 '升壓救助' 反覆幾次,
這當然不是想要的。如果你在模式中放置了幾對,你會得到幾個捕捉組。正確的模式,如果你想只提取「升壓救助」和最後一個字符串之間的所有文字'debt'是:

pattern = r'boost bailout.+debt' 

和正則表達式是

reg = re.compile(r'boost bailout.+debt',re.DOTALL) 

re.DOTALL是使得點符號與每個字符匹配的標誌,由換行符組成:它代替[\s\S]

但是如果你想「提升救助」和「債」的首次亮相之間提取,它必須是

pattern = r'boost bailout.+?debt' 

此外,使用reg.search(text).group()代替reg.findall(text)產生一個元素的列表。

注意圖案通過pattern = r'boost bailout.+?debt'定義爲字符串對象,
REG通過reg = re.compile(pattern)定義的一個RegexObject對象。

值得名字正則表達式是RegexObject,有什麼值得名字模式是字符串。

0

您將返回一個元組,因爲您可以在Python documentation for the re module中讀取,括號會創建捕獲組,然後可以單獨檢索它們。爲了避免這種情況,您應該使用非捕獲組:(?: ...)