2017-02-25 64 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

谢谢。我已经改变了有问题的字符串,你的方法不会工作。无论如何,非常感谢您的帮助! –