使用正则表达式(括号)进行标记

Jür*_* K. 6 regex string split tokenize

我有以下文字:

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)']

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

谢谢你的想法。

Wik*_*żew 5

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

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

re.findall(r"\w+(?:'\w+)?|[^\w\s]", s)
Run Code Online (Sandbox Code Playgroud)

在这里,\w+(?:'\w+)?匹配像peopleor之类的单词people's,并[^\w\s]匹配单词和空白字符以外的单个字符。

查看正则表达式演示

Python 演示

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))
Run Code Online (Sandbox Code Playgroud)

另一个使用(and标记化的示例)

[^()\s]+|[()]
Run Code Online (Sandbox Code Playgroud)

查看正则表达式演示

此处,[^()\s]+匹配(,)和空格以外的 1 个或多个符号,并[()]匹配()