2017-05-29 58 views
0

所以,我想將這個文本拆分成句子。Python在正則表達式上拆分而不刪除分隔符

s = """You! Are you Tom? I am Danny.""" 

,所以我得到:

{"you!", "Are you Tom?", "I am Danny.} 

這就是我想通過正則表達式'[.!\?]'文本拆分而不刪除分隔符。什麼是在python中實現這個最Python化的方法?

我知道這些問題:

JS string.split() without removing the delimiters

Python split() without removing the delimiter

但我的問題有哪些問題複雜化的各種分隔符(.?!)。

回答

4

你可以使用re.findall與正則表達式.*?[.!\?];懶惰量詞*?確保每個花樣最多匹配要匹配於特定的分隔符:通過匹配由一個前面一個空字符串

import re 

s = """You! Are you Tom? I am Danny.""" 
re.findall('.*?[.!\?]', s) 
# ['You!', ' Are you Tom?', ' I am Danny.'] 
3

如果Python的支持零長度匹配分裂,你可以做到這一點分隔符:

(?<=[.!?]) 

演示:https://regex101.com/r/ZLDXr1/1

不幸的是,Python does not support split by zero-length matches。然而,該解決方案在其他支持向後看的語言中可能仍然有用。

但是,根據您的輸入/輸出數據樣本,您需要先用空格分隔其中一個分隔符。所以,正則表達式是:

(?<=[.!?])\s+ 

演示:https://regex101.com/r/ZLDXr1/2

Python的演示:https://ideone.com/z6nZi5

如果空間是可選的,所以re.findall溶液@Psidom建議是最好的,我相信。

+0

我想我沒有清楚地說明我的問題。如果在'[。\ ?!]'之後現在有空格怎麼辦? – GA1

0

如果你喜歡使用分割法,而不是比賽,一個解決方案拆配組

splitted = filter(None, re.split(r'(.*?[\.!\?])', s)) 

濾波器消除若有空字符串。

如果句子之間沒有空格這甚至會工作,或者如果你需要趕上尾的句子用不同的標點符號符號結束,比如Unicode的省略號(或確實存在的話)

它甚至有可能讓你保持原樣(通過逃避糾正和增加括號)。

splitted = filter(None, re.split(r'([\.!\?])', s)) 

然後合併甚至和不平衡的因素,並刪除多餘的空格

Python split() without removing the delimiter

0

嚴格地說,你不想拆就「!?」,而是在空格後面那些角色。以下將起作用:

>>> import re 
>>> re.split(r'(?<=[\.\!\?])\s*', s) 
['You!', 'Are you Tom?', 'I am Danny.'] 

這會在空格上分割,但只有在前面加上。,!或?字符。

0

最簡單的方法是使用nltk

import nltk 
nltk.sent_tokenize(s) 

它會返回所有句子的列表而不會丟失分隔符。