修改正则表达式以包含带连字符的单词

时间:2018-04-05 18:29:10

标签: python regex tokenize

我在另一个堆栈问题上找到了这个tokenizer,但是,我需要修改它并且正在努力。它目前将带连字符的单词拆分为单独的标记,但我希望它们是单个标记。

tokenizer:

[(m.start(0), m.end(0),m.group()) for m in re.finditer("\w+|\$[\d\.]+|\S+",target_sentence)]

给出以下句子:“half-life是一个单一的标记”它应该给出以下标记(加上字符偏移信息):

['half-life', 'is', 'a', 'single', 'token']

相反,它给出了:

[(0, 4, 'half'),
(4, 9, '-life'),
(10, 12, 'is'),
(13, 14, 'a'),
(15, 21, 'single'),
(22, 27, 'token')]
编辑:我希望角色信息不仅仅是单词标记,所以string.split不会削减它

2 个答案:

答案 0 :(得分:2)

您的正则表达式使用half\w+匹配,并使用上一个替代-life匹配剩余的\S+

您可以使用此正则表达式捕获可选的带连字符的单词:

\w+(?:-\w+)*|\$[\d.]+|\S+

RegEx Demo

\w(?:-\w+)*将匹配由连字符分隔的1个或多个单词。

答案 1 :(得分:0)

试试这个 -

[m.group() for m in re.finditer("[\w-]+|\$[\d\.-]+|\S+",target_sentence)]
>> ['half-life', 'is', 'a', 'single', 'token']
  • 只让代码返回m.group()而不是匹配的索引
  • 在字符类中包含-个字符