Tokenize基于空格和尾随标点符号?

时间:2017-04-27 01:33:17

标签: python regex

我尝试使用正则表达式将字符串拆分为基于空格或尾随标点符号的列表。

e.g。

s = 'hel-lo  this has whi(.)te, space. very \n good'

我想要的是

['hel-lo', 'this', 'has', 'whi(.)te', ',', 'space', '.', 'very', 'good']

s.split()让我大部分都在那里,除非它没有处理尾随的空白。

3 个答案:

答案 0 :(得分:2)

import re
s = 'hel-lo  this has whi(.)te, space. very \n good'
[x for x in re.split(r"([.,!?]+)?\s+", s) if x]
# => ['hel-lo', 'this', 'has', 'whi(.)te', ',', 'space', '.', 'very', 'good']

您可能需要调整“标点符号”。

答案 1 :(得分:0)

使用spacy的粗略解决方案。它已经很好地用于标记单词。

import spacy
s = 'hel-lo  this has whi(.)te, space. very \n good'
nlp = spacy.load('en') 
ls = [t.text for t in nlp(s) if t.text.strip()]

>> ['hel', '-', 'lo', 'this', 'has', 'whi(.)te', ',', 'space', '.', 'very', 'good']

但是,它还会对-之间的单词进行标记,因此我借用here的解决方案将-之间的单词合并在一起。

merge = [(i-1, i+2) for i, s in enumerate(ls) if i >= 1 and s == '-']
for t in merge[::-1]:
    merged = ''.join(ls[t[0]:t[1]])
    ls[t[0]:t[1]] = [merged]

>> ['hel-lo', 'this', 'has', 'whi(.)te', ',', 'space', '.', 'very', 'good']

答案 2 :(得分:0)

我正在使用Python 3.6.1。

import re

s = 'hel-lo  this has whi(.)te, space. very \n good'
a = [] # this list stores the items
for i in s.split(): # split on whitespaces
    j = re.split('(\,|\.)$',i) # split on your definition of trailing punctuation marks
    if len(j) > 1:
        a.extend(j[:-1])
    else:
        a.append(i)
 # a -> ['hel-lo', 'this', 'has', 'whi(.)te', ',', 'space', '.', 'very', 'good']