Python提取空格分隔的单词,可能包含特定的标点符号

时间:2017-02-25 10:40:14

标签: python regex python-3.x

我有一些文本任务,我需要正确地将字符串分成单词。 对于我的任务,我使用 Python3

这种方式不适合我:

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”)
  • 删除“[”,“{”,“(”等...

如果熟悉regexp的人会帮我完成这项任务,我将非常感激。从文档中获取术语似乎是一项非常普遍的任务。

3 个答案:

答案 0 :(得分: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']

答案 1 :(得分: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行过滤输出列表的原因。

答案 2 :(得分: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']