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

Python 修改正则表达式以包含连字符单词,python,regex,tokenize,Python,Regex,Tokenize,我在另一个堆栈问题上找到了这个标记器,但是,我需要修改它,并且正在努力。它目前将连字号拆分为单独的标记,但我希望它们是单个标记 标记器: [(m.start(0), m.end(0),m.group()) for m in re.finditer("\w+|\$[\d\.]+|\S+",target_sentence)] 给出以下句子:“半衰期是单个标记”,它应该给出以下标记(加上字符偏移量信息): 相反,它给出了: [(0, 4, 'half'), (4, 9, '-life'), (10,

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

标记器:

[(m.start(0), m.end(0),m.group()) for m in re.finditer("\w+|\$[\d\.]+|\S+",target_sentence)]
给出以下句子:“半衰期是单个标记”,它应该给出以下标记(加上字符偏移量信息):

相反,它给出了:

[(0, 4, 'half'),
(4, 9, '-life'),
(10, 12, 'is'),
(13, 14, 'a'),
(15, 21, 'single'),
(22, 27, 'token')]

编辑:我希望字符信息不仅仅是单词标记,所以string.split不会剪切它

您的正则表达式使用
\w+
匹配
一半
,使用最后一个备用
\S+
匹配剩余的
-life

您可以使用此正则表达式捕获可选的连字号:

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

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

试试这个-

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

使用在线正则表达式调试工具和/或python的调试正则表达式标记非常有帮助。只使用
print(“半衰期是一个单独的令牌“.split()”)有什么不对?
?如果您添加了
\s+
选项,则使用
\w+\$[\d\.]+
没有任何意义。可能重复的++ve为伟大的正则表达式先生。对不起打扰你了。请您指导我如何学习不同语言的正则表达式(如我的技术大师Anubhava sir do:),我将非常感谢您,先生。@RavinderSingh13:您已经非常擅长正则表达式了。此外,我建议使用它进行彻底的学习。
[m.group() for m in re.finditer("[\w-]+|\$[\d\.-]+|\S+",target_sentence)]
>> ['half-life', 'is', 'a', 'single', 'token']