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

时间:2017-03-29 12:02:01

标签: 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)']

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

感谢您的想法。

2 个答案:

答案 0 :(得分:2)

如果要使用对上下文有特殊限制的正则表达式对字符串进行标记,则可以使用通常产生更清晰输出的匹配方法(特别是在结果列表中出现空元素时)。

任何单词字符都与\W匹配,任何非单词字符都与\w+|\W+匹配。如果您想将字符串标记为单词和非单词字符,则可以使用'正则表达式。但是,在您的情况下,您希望匹配可选地后跟re.findall(r"\w+(?:'\w+)?|[^\w\s]", s) 的单词字符块,后跟1个单词字符,以及任何其他不是空格的单个字符。

使用

\w+(?:'\w+)?

此处people匹配people's[^\w\s]等字词,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)) 匹配单词和空白字符以外的单个字符。

请参阅regex demo

Python demo

(

使用)[^()\s]+|[()] 进行令牌化的另一个示例:

[^()\s]+

请参阅regex demo

此处,(匹配)[()]和空白以外的1个或多个符号,(匹配)class User extends Model { protected $appends = ['extra']; public function getExtraAttribute() { return $this->attributes['extra'] == 'some string...'; } }

答案 1 :(得分:0)

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

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

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