【问题标题】:How to tokenize, splitting the adjacent digit-letter?如何标记,拆分相邻的数字字母?
【发布时间】:2019-02-07 07:41:36
【问题描述】:

我正在尝试将hello world123 之类的内容标记为helloworld123。 我认为我有两部分需要的代码,但无法将它们正确组合到tokenize

(?u)\b\w+\b
(?<=\D)(?=\d)|(?<=\d)(?=\D)

【问题讨论】:

  • 第一个正则表达式提取由字母、数字和下划线组成的整个单词(还包括一些其他 Unicode 类别,但这基本上是 \w 匹配的内容),第二个正则表达式将数字从非位数。我认为您想要的只是匹配 1 个或多个字母或 1 个或多个数字的条纹。请参阅下面的解决方案。
  • 谢谢,这真的很有帮助。也许为了增加一点复杂性,我们如何将 1.5mL 之类的东西分成“1.5”和“mL”
  • 感谢您的帮助

标签: python regex


【解决方案1】:

你可以使用

import re
s = "hello world123"
print(re.findall(r'[^\W\d_]+|\d+', s))
# => ['hello', 'world', '123']

Python demo

模式详情

  • [^\W\d_]+ - 1 个或多个字母
  • | - 或
  • \d+ - 1 位以上。

请参阅regex demo

奖励:要匹配任何字母子串和各种数字,请使用

[^\W\d_]+|[-+]?\d*\.?\d+(?:[eE][+-]?\d+)?

this regex demo

有关正则表达式的详细信息,请参阅 Parsing scientific notation sensibly?

【讨论】:

  • 我想[^\W\d_][A-Za-z] 之间可能存在细微差别,对于本地化的重音字母
  • @Jean-FrançoisFabre 是的,还有一个relevant thread about [^\W\d_]。对于 Python 2 用户,要使其完全支持 Unicode,re.U 标志(或其内联 (?u) 嵌入式标志)是必需的(该行为在 Python 3 中是默认行为)。而且,在这些情况下,要仅匹配 ASCII 数字,[0-9]+ 将比匹配所有 Unicode 数字的 \d+ 更合适。
猜你喜欢
  • 1970-01-01
  • 2021-11-06
  • 2016-09-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多