2013-05-09 80 views
0

我使用這個命令可以找到在文中的句子:蟒蛇,正則表達式找到一個subsentence,排除bounaries

sentences = re.findall("[A-Z].*?[\.!?;]", stripped_value, re.MULTILINE | re.DOTALL | re.UNICODE)

有沒有辦法排除了一句邊界(逗號,句號,問號等) 與此同時? (我的意思是沒有爲每個字符使用strip命令)。

回答

2

使用捕獲組:

sentences = re.findall(r'([A-Z].*?)[.!?;]', stripped_value, re.MULTILINE | re.DOTALL | re.UNICODE) 

.findall()返回捕獲組的內容而不是整個比賽,如果在表達一個本。

演示:

>>> stripped_value = '''Some sentence. And another. 
... Multiline text works too! And commas, they are included; but not the semicolon? 
... ''' 
>>> import re 
>>> re.findall(r'([A-Z].*?)[.!?;]', stripped_value, re.MULTILINE | re.DOTALL | re.UNICODE) 
['Some sentence', 'And another', 'Multiline text works too', 'And commas, they are included'] 

re.findall() documentation

如果一個或多個基團存在於該圖案,返回組的列表;如果模式有多個組,這將是一個元組列表。

或者,也可以使用一個前向斷言:

sentences = re.findall("[A-Z].*?(?=[\.!?;])", stripped_value, re.MULTILINE | re.DOTALL | re.UNICODE) 

(?=..)陽性預測先行斷言充當錨;只有在匹配的文本之後有斑點纔會匹配模式。因爲.findall()不需要提取匹配的組,所以預覽可以給你更快的結果。任何一種選擇的輸出都是相同的。

1

您可以使用捕獲組

regex = "([A-Z].*?)[\.!?;]" 

...你搜索,獲取每場比賽的匹配對象....

sentence = match_obj.groups(1) 

此外,我注意到你堅持所有的句子開始與大寫字母,但你終止他們在第一個分號。我會說「句子」通常是指「全部」;「分離的子句連接「。但是,如果你想'''作爲分隔符,那麼我會將每個子句作爲一個句子(因爲它是,除了大寫字母)。