【发布时间】:2017-08-22 21:49:15
【问题描述】:
我有以下文字:
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+(?:'\w+)?|[^\w\s]匹配可能更容易。 -
拆分和匹配有什么区别?总结一下我需要的问题是 (foo) -> ["(", "foo", ")"])
-
很好,然后使用
re.findall(r"\w+(?:'\w+)?|[^\w\s]", s) -
对不起,必须使用双引号字符串文字,我编辑了评论。它对字符串进行tokenize。只是测试,你会看到。
w+(?:'\w+)?将匹配所有 1+ 个单词的字符块,后跟可选的',后跟 1+ 个单词的 char 子字符串,[^\w\s]将匹配除单词和空白字符之外的单个字符。 -
仅适用于
(foo)-re.findall(r'\w+|\W', s)- 匹配 1 个或多个单词字符 (\w+),或 (|) 1 个非单词字符 (\W)。但是,如果您打算避免匹配空格(可以与\W匹配),则需要使用[^\w\s]从模式中排除它们。这是一种有例外的对比原则。我会发布一个答案。
标签: regex string split tokenize