代码之家  ›  专栏  ›  技术社区  ›  seanysull

修改regex以包含连字符单词

  •  2
  • seanysull  · 技术社区  · 7 年前

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

    标记器:

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

    给出以下句子:“半衰期是单个标记”,它应该给出以下标记(加上字符偏移量信息):

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

    相反,它提供:

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

    编辑:我想要的字符信息不仅仅是单词标记,所以字符串。斯普利特不会把它割断

    2 回复  |  直到 7 年前
        1
  •  2
  •   anubhava    7 年前

    您的正则表达式匹配 half 使用 \w+ 和匹配剩余 -life 使用最后一个备选方案 \S+

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

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

    RegEx Demo

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

        2
  •  0
  •   Max Friederichs    7 年前

    试试这个-

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