2017-02-25 29 views
0

我有一些任務與文本,我需要將字符串正確拆分爲單詞。 對於我的任務,我正在使用Python3Python從字符串獲取整個單詞

這種方式不適合我:

re.sub("[^\w]", " ", hotelName.lower()).split() 

因爲句子中詞彙是這樣的:

"[{(St.Augst bridge), South-West]} . a - a Torreluca! B&B O'Dell! & Cabin& Wastlgasse MM-505?." 

都吐盡列表:

['st', 'augst', 'bridge', 'south', 'west', 'torreluca', 'b', 'b', 'o', 
'dell', 'cabin', 'wastlgasse', 'mm', '505'] 

但我需要以這種方式拆分術語(以節省整個術語):

["st.augst", "bridge", "South-West", "Torreluca", "B&B", "O'Dell", 
"Cabin", "Wastlgasse", "MM-505"] 

這意味着我需要通過拆分文本:

  • 空間
  • 「」, 「!」 「?」
  • 「。」如果在空格之前的單詞末尾或字符串末尾(以防止St.Augst =>「st」,「august」)
  • 刪除「[」,「{」,「(」等等...

如果有人誰熟悉的正則表達式將幫助我完成該任務。這似乎是很常見的任務,從文件獲取方面。

+0

你絕對需要手工用正則表達式來做到這一點? 否則,它可能是一些重型火炮的使用,但看看nltk,他們有tokenizers可以做這項工作 – LoicM

回答

2

搜索單詞邊界\b之間的非空白的模式:

import re 

hotel_name = "(St.Augst bridge), South-West Torreluca! B&B O'Dell Cabin Wastlgasse MM-505?" 

REGEX = r"\b\S+\b" 
finder = re.compile(REGEX) 

matches = re.findall(finder, hotel_name) 
print(matches) 

輸出:

['St.Augst', 'bridge', 'South-West', 'Torreluca', 'B&B', "O'Dell", 'Cabin', 'Wastlgasse', 'MM-505'] 
+0

謝謝。我已經改變了有問題的字符串,你的方法不會工作。無論如何,非常感謝您的幫助! –

+0

你能詳細說明一下嗎?當我用新字符串運行我的代碼時,我得到了'['St.Augst','bridge','South-West','a','a','Torreluca','B&B','O'Dell 「,'小屋','Wastlgasse','MM-505']',這似乎比我運行所選答案時得到的更正確:'['''''''''''''''''''', '','a',' - ','a','Torreluca','B&B','O'Dell','Cabin','Wastlgasse','MM-505。']' – Crispin

+0

One分鐘,我試圖理解你的正則表達式實際上是如何工作的。 –

1

Anwser更新一起工作,我會很感激python3

那麼可能有更好的辦法,但什麼以下工作:

import re 
string = "(St.Augst bridge), South-West Torreluca! B&B O'Dell Cabin Wastlgasse MM-505?" 
wordlist = re.split(r'[()!?,]|\.?\s+', string) 
wordlist = list(filter(lambda a: a != '', wordlist)) 
print(wordlist) 

輸出: '!' '?'

['St.Augst', 'bridge', 'South-West', 'Torreluca', 'B&B', "O'Dell", 'Cabin', 'Wastlgasse', 'MM-505'] 

正則表達式[()!?,]|\.?\s+讀起來像「所有字符 '(', ')',或」 「或者可以通過一個點來之前一個空白

因爲有時候我們是恰好與相匹配的字符串的分割部位」的例子,'re.split將包含返回列表清空字符串,那爲什麼我在篩選輸出列表線4.

+0

非常感謝!)你的答案符合我的問題。 –

1

首先,翻譯出你不想要的東西,然後拆分。

In [26]: test = "(St.Augst bridge), South-West Torreluca! B&B O'Dell Cabin Wastlgasse MM-505?" 

In [27]: test.translate({ord(j): None for j in ',?!()'}).split() 
Out[27]: 
['St.Augst', 
'bridge', 
'South-West', 
'Torreluca', 
'B&B', 
"O'Dell", 
'Cabin', 
'Wastlgasse', 
'MM-505'] 
+0

謝謝。我已經改變了有問題的字符串,你的方法不會工作。無論如何,非常感謝您的幫助! –

相關問題