用于选择以包含数字的标记开头的短语的正则表达式

Regex for selecting a phrase starting with tokens containing digits

我有这样的文字:

text = 'this is a sentence, it has 1 number in it, and another one 123 here. we want to select n8m3r1c-aa words and phrases - until the punctuation. this is some phr4se!1 with text.'

我的目标是 select 个片段,从任何 token/word 开始,其中有一个数字,前面有一个 space。选择应该发生在找到下一个标点符号之前,而不是标记内的标点符号。

预期输出:

1 number in it
123 here
n8m3r1c-aa words and phrases
phr4se!1 with text

我目前的做法:

re.findall(r'\s(\d.+?)[.,!]', text)

但这只能找到:

1 number in it
123 here

我有点卡住了 selection 在不仅以数字开头而且还包含数字的标记处开始。感谢任何帮助和建议!

您尝试的模式得到 2 个匹配项,因为它以 \s(\d 开头,这意味着它应该以数字开头。

您可以使用 [^\s\d]*\d\S* 来匹配可选的空白字符直到第一个数字,并且可以选择匹配后面的非空白字符。

(?<!\S)[^\s\d]*\d\S*.*?(?=[.,!-])

部分

  • (?<!\S) 断言空白边界在左边
  • [^\s\d]* 匹配除空白字符或数字以外的任何字符
  • \d匹配一个数字
  • \S* 匹配 0+ 次非空白字符(“单词”的其余部分)
  • .*? 尽可能匹配除换行符外的任何字符
  • (?=[.,!-]) 正面前瞻,断言右边是任何列出的字符

Regex demo

如果开头应该有一个空白字符,您还可以使用捕获组并匹配前后的内容:

\s([^\s\d]*\d\S*.*?)[.,!-]

Regex demo