正则表达式分词器:将文本拆分为单词、数字、标点和空格(不删除任何内容)

8 投票
3 回答
4882 浏览
提问于 2025-04-16 23:09

差不多这个帖子(samplebias的回答)里找到了问题的答案;不过我需要把一个短语分成单词、数字、标点符号和空格/制表符。我还需要保持这些东西出现的顺序(而那个帖子里的代码已经做到了这一点)。

所以,我找到的东西是这样的:

    from nltk.tokenize import *
    txt = "Today it's   07.May 2011. Or 2.999."
    regexp_tokenize(txt, pattern=r'\w+([.,]\w+)*|\S+')
    ['Today', 'it', "'s", '07.May', '2011', '.', 'Or', '2.999', '.']

但我需要得到的列表是这样的:

    ['Today', ' ', 'it', "'s", ' ', '\t', '07.May', ' ', '2011', '.', ' ', 'Or', ' ', '2.999', '.']

正则表达式一直是我的弱项,所以经过几个小时的研究,我还是搞不定。谢谢大家!!

3 个回答

0

在这个正则表达式 \w+([.,]\w+)*|\S+ 中,\w+([.,]\w+)* 用来匹配单词,而 \S+ 则用来匹配其他非空白的内容。

如果你想同时匹配空格和制表符,可以试试这个:\w+([.,]\w+)*|\S+|[ \t]

0

你提供的输出结果和预期的有些不符,如果问题中能多提供一些细节会更好,不过无论如何:

>>> txt = "Today it's   07.May 2011. Or 2.999."
>>> regexp_tokenize(txt, pattern=r"\w+([.',]\w+)*|[ \t]+")
['Today', ' ', "it's", ' \t', '07.May', ' ', '2011', ' ', 'Or', ' ', '2.999']
4

我觉得像这样的代码应该能帮到你。可能这个正则表达式比实际需要的要复杂一些,但你的需求有点模糊,而且和你提供的预期输出不太一致。

>>> txt = "Today it's \t07.May 2011. Or 2.999."
>>> p = re.compile(r"\d+|[-'a-z]+|[ ]+|\s+|[.,]+|\S+", re.I)
>>> slice_starts = [m.start() for m in p.finditer(txt)] + [None]
>>> [txt[s:e] for s, e in zip(slice_starts, slice_starts[1:])]
['Today', ' ', "it's", ' ', '\t', '07', '.', 'May', ' ', '2011', '.', ' ', 'Or', ' ', '2', '.', '999', '.']

撰写回答