使用正则表达式(括号)进行分词

Tokenize by using regular expressions (parenthesis)

我有以下文字:

I don't like to eat Cici's food (it is true)

我需要将它标记为

['i', 'don't', 'like', 'to', 'eat', 'Cici's', 'food', '(', 'it', 'is', 'true', ')']

我发现以下正则表达式 (['()\w]+|\.) 拆分如下:

['i', 'don't', 'like', 'to', 'eat', 'Cici's', 'food', '(it', 'is', 'true)']

如何从令牌中取出括号并将其变成自己的令牌?

谢谢你的想法。

您应该将单数字符标记(在这种特殊情况下为括号)与表示一系列标记的字符分开:

([().]|['\w]+)

演示:https://regex101.com/r/RQfYhL/2

当您想使用正则表达式对字符串进行标记化,并对上下文有特殊限制时,您可以使用通常会产生更清晰输出的匹配方法(尤其是当涉及到结果列表中的空元素时)。

任何单词字符都与 \w 匹配,任何非单词字符都与 \W 匹配。如果您想将字符串标记为单词和非单词字符,您可以使用 \w+|\W+ 正则表达式。但是,在您的情况下,您想要匹配可选地后跟 ' 的单词字符块,然后是 1+ 个单词字符,以及任何其他非空格的单个字符。

使用

re.findall(r"\w+(?:'\w+)?|[^\w\s]", s)

此处,\w+(?:'\w+)?匹配peoplepeople's等词,[^\w\s]匹配单词和空格字符以外的单个字符。

regex demo

Python demo:

import re
rx = r"\w+(?:'\w+)?|[^\w\s]"
s = "I don't like to eat Cici's food (it is true)"
print(re.findall(rx, s))

另一个使用 () 进行分词的例子:

[^()\s]+|[()]

regex demo

这里,[^()\s]+匹配除()和空格以外的1个或多个符号,[()]匹配().