我有一些文本任务,我需要正确地将字符串分成单词。 对于我的任务,我使用 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"]
这意味着我需要通过以下方式分割文字:
如果熟悉regexp的人会帮我完成这项任务,我将非常感激。从文档中获取术语似乎是一项非常普遍的任务。
答案 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']