正则表达式:不匹配以特定字符开头的数字

regex: don't match number preceded by certain character

以下代码提取出现在字符串中的第一个数字序列:

num = re.findall(r'^\D*(\d+)', string)

我想补充一点,正则表达式不匹配前面有 vV 的数字。

示例:

string = 'foobarv2_34 423_wd"
Output: '34'

如果需要获取第一个匹配项,需要使用re.search,而不是re.findall

在这种情况下,您可以使用更简单的正则表达式,例如 (?<!v)\d+re.I:

import re
m = re.search(r'(?<!v)\d+', 'foobarv2_34 423_wd', re.I)
if m:
    print(m.group()) # => 34

参见Python demo

详情

  • (?<!v) - 如果 v(或 V,因为使用了 re.I),则匹配失败的否定后视位置
  • \d+ - 一位或多位数字。

如果由于某种原因不能使用re.search,可以使用

^.*?(?<!v)(\d+)

参见 this regex demo。请注意,\D*(零个或多个 non-digits)被替换为 .*?,匹配零个或多个除换行字符外的字符尽可能少(使用 re.Sre.DOTALL, 它也将匹配换行符) 因为需要匹配所有不以 v.

开头的数字

更多详情:

  • ^ - 字符串开头
  • .*? - 除换行符外的零个或多个字符尽可能少
  • (?<!v) - 如果 v(或 V,因为使用了 re.I),则匹配失败的否定后视位置
  • (\d+) - 第 1 组:一个或多个数字。