首页 > 解决方案 > Python REGEX 如何从变量中提取特定数字

问题描述

我有以下问题:

var a = ' 15159970 (30.12.2015), 15615115 (01.01.1970), 11224455, 55441123

我想要一个正则表达式来仅提取数字:15159970、15615115、11224455、55441123

到目前为止有什么:

re.findall(r'(\d+\s)\(', a)

仅提取前 2 个数字:15159970、15615115

还有第二个 var b = 15159970, 15615115, 11224455, 55441126 我想比较这两个变量,如果它们不同,则打印(“变量不同!”)

谢谢!

标签: pythonregexpython-3.x

解决方案


您可以提取所有前面没有数字或数字+点且后面没有点+数字或数字的数字块

(?<!\d)(?<!\d\.)\d+(?!\.?\d)

查看正则表达式演示

细节

  • (?<!\d)- 一个否定的后向查找,导致紧跟在数字前面的位置失败
  • (?<!\d\.)- 一个否定的后向查找,导致紧接在数字和点之前的位置失败
  • \d+- 1+ 位数
  • (?!\.?\d)- 一个否定的前瞻,它使一个位置失败,紧跟一个数字或一个点 + 一个数字。

Python演示

import re
a = ' 15159970 (30.12.2015), 15615115 (01.01.1970), 11224455, 55441123 '
print( re.findall(r'(?<!\d)(?<!\d\.)\d+(?!\.?\d)', a) )
# => ['15159970', '15615115', '11224455', '55441123']

另一种解决方案:仅提取括号之外的数字块

请参阅此 Python 演示

import re
text = "15159970 (30.12.2015), 15615115 (01.01.1970), 11224455, 55441123 (28.11.2014 12:43:14)"
print( list(filter(None, re.findall(r'\([^()]+\)|(\d+)', text))) )
# => ['15159970', '15615115', '11224455', '55441123']

在这里,\([^()]+\)|(\d+)比赛

  • \([^()]+\) - ,除and和 then(之外的任何 1+ 字符())
  • |- 或者
  • (\d+)- 匹配并捕获到第 1 组一个或多个数字(re.findall如果模式中有捕获组,则仅包括捕获的子字符串)。

当出现非括号匹配时,结果中会出现空项目,因此,我们需要删除它们(使用list(filter(None, results))或使用[x for x in results if x])。


推荐阅读