正则表达式:不匹配以特定字符开头的数字
regex: don't match number preceded by certain character
以下代码提取出现在字符串中的第一个数字序列:
num = re.findall(r'^\D*(\d+)', string)
我想补充一点,正则表达式不匹配前面有 v
或 V
的数字。
示例:
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.S
或 re.DOTALL
, 它也将匹配换行符) 因为需要匹配所有不以 v
.
开头的数字
更多详情:
^
- 字符串开头
.*?
- 除换行符外的零个或多个字符尽可能少
(?<!v)
- 如果 v
(或 V
,因为使用了 re.I
),则匹配失败的否定后视位置
(\d+)
- 第 1 组:一个或多个数字。
以下代码提取出现在字符串中的第一个数字序列:
num = re.findall(r'^\D*(\d+)', string)
我想补充一点,正则表达式不匹配前面有 v
或 V
的数字。
示例:
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.S
或 re.DOTALL
, 它也将匹配换行符) 因为需要匹配所有不以 v
.
更多详情:
^
- 字符串开头.*?
- 除换行符外的零个或多个字符尽可能少(?<!v)
- 如果v
(或V
,因为使用了re.I
),则匹配失败的否定后视位置(\d+)
- 第 1 组:一个或多个数字。