我是新來的正則表達式,我正在嘗試編寫一個函數來將字符串分解爲它的收縮和標點符號。正則表達式捕獲標點符號和收縮
例如:I'm feeling sad today.
應該返回一個列表:["I","'m","feeling","sad","today","."]
。
到目前爲止,我只能過濾與([a-zA-Z])\w*
的字母,我不知道如何過濾這包括標點符號。
我是新來的正則表達式,我正在嘗試編寫一個函數來將字符串分解爲它的收縮和標點符號。正則表達式捕獲標點符號和收縮
例如:I'm feeling sad today.
應該返回一個列表:["I","'m","feeling","sad","today","."]
。
到目前爲止,我只能過濾與([a-zA-Z])\w*
的字母,我不知道如何過濾這包括標點符號。
import re
st = "I'm feeling sad today."
li = re.findall(r'\w+|[;.,!?:]|\'\w+',st)
['I', "'m", 'feeling', 'sad', 'today', '.']
有沒有辦法用findall來做? – NeptuneGamer
@NeptuneGamer,是的,我已經更新了re.findall。 – LetzerWille
這是幾乎那裏,但是'與連接m – NeptuneGamer
你需要搜索的字符它們要麼隻字字符的運行,或者兩者都不是字字符也不空白:
>>> s = "I'm feeling sad today."
>>> rgx = re.compile(r'(\w+|[^\w\s]+)')
>>> rgx.findall(s)
['I', "'", 'm', 'feeling', 'sad', 'today', '.']
編輯:
爲了捕捉收縮,正則表達式需要更復雜。它必須使用後退斷言來檢查撇號是否由一個單詞字符(否則它將錯誤地匹配引用的單詞)前綴。這裏有一個基本的解決方案:
>>> s = "I'm feeling 'sad' today."
>>> rgx = re.compile(r"((?<=\w)'\w+|\w+|[^\w\s]+)")
>>> rgx.findall(s)
['I', "'m", 'feeling', "'", 'sad', "'", 'today', '.']
雖然有一些邊緣情況,這不能處理。例如,有一些音譯的外來詞(例如Qur'an
)包含嵌入的撇號。當然,還有像O'Connor
這樣的名字和O'Connor's
之類的所有格,以及His 'n' Hers
這樣的非標準收縮。
我意識到它可能不明確的問題,但撇號加入到字母('米),這是證明難以產生 – NeptuneGamer
@NeptuneGamer。我已經用一個改進的解決方案更新了我的答案,這個解決方案很有希望。 – ekhumoro
那麼'感覺'呢? – Kasramvd
我編輯了 – NeptuneGamer