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

7
我有如下文本:
我不喜欢吃Cici的食物(这是真的)
我需要将其标记化为:
['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)']
如何将括号从令牌中删除并将其变为自己的令牌?
感谢您的想法。

语言是英语。 - Jürgen K.
1
很好,那么使用 re.findall(r"\w+(?:'\w+)?|[^\w\s]", s) - Wiktor Stribiżew
1
抱歉,必须使用双引号字符串字面值,我编辑了注释。它确实分词字符串。只需测试即可看到。w+(?:'\w+)?将匹配所有1个或多个单词字符块,后跟一个可选的',后跟1个或多个单词字符子字符串,而[^\w\s]将匹配除单词和空格字符之外的单个字符。 - Wiktor Stribiżew
1
仅适用于 (foo) - re.findall(r'\w+|\W', s) - 匹配1个或多个单词字符(\w+),或 (|) 1个非单词字符(\W)。但是,如果您计划避免匹配空格(可以与\W匹配),则需要使用[^\w\s]从模式中排除它们。这是一种带有例外的对比原则。我会发布一个答案。 - Wiktor Stribiżew
是的,如果避免空格,re.findall(r'\w+|\W', s)看起来会是什么样子并不清楚。 - Jürgen K.
显示剩余13条评论
2个回答

6
当您想使用正则表达式对具有上下文特殊限制的字符串进行标记化时,可以使用匹配方法,这通常会产生更清晰的输出(尤其是在结果列表中包含空元素时)。
任何单词字符都可以与\w匹配,任何非单词字符都可以与\W匹配。如果您想将字符串标记化为单词和非单词字符,则可以使用\w+|\W+正则表达式。但是,在您的情况下,您希望匹配可选跟随具有1个或多个单词字符和任何其他不是空格的单个字符的'的单词字符块。
使用
re.findall(r"\w+(?:'\w+)?|[^\w\s]", s)

这里,\w+(?:'\w+)?匹配像peoplepeople'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))

下面是一个例子,它将使用()进行分词:

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

请查看正则表达式演示
这里,[^()\s]+匹配一个或多个除()和空格之外的符号,[()]匹配()

0
你应该将单个的字符标记(在这种情况下是括号)与表示一系列标记的字符分开。
([().]|['\w]+)

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接