【问题标题】:Python REGEX How to extract particular numbers from variablePython REGEX 如何从变量中提取特定数字
【发布时间】:2019-11-25 09:50:22
【问题描述】:

我有以下问题:

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 我想比较这两个变量,如果它们不同,则打印(“变量不同!”)

谢谢!

【问题讨论】:

  • 问题是你表达式中的左括号。该模式只出现两次。
  • 您可以使用以下正则表达式查找前面没有.( 正则表达式的数字:(?<![(.])\b(\d+)\b
  • 我使用的是(\d+)(?:\s+|,|\n|$),它只匹配模式,后跟:换行符、空格、逗号或行尾。但我认为@ChrisDoyle 的建议更好。
  • 不,Regex to match text, but not if contained in brackets 没有回答这个问题,标准不仅仅是跳过括号中的所有内容。即使这是唯一的标准,链接线程中的答案实际上并不适用于所有情况,我下面的解决方案可以。

标签: python regex python-3.x


【解决方案1】:

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

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

regex demo

详情

  • (?&lt;!\d) - 否定的后向查找,导致紧跟数字前的位置失败
  • (?&lt;!\d\.) - 否定的后视,导致紧跟数字和点的位置失败
  • \d+ - 1 位以上
  • (?!\.?\d) - 一个否定的前瞻,失败的位置紧跟一个数字或一个点 + 一个数字。

Python demo:

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']

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

this Python demo:

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+) 匹配

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

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

【讨论】:

  • 我也可以去掉下面的括号 (28.11.2014 12:43:14) 吗?我还想比较其中两个变量,例如 var a 和另一个具有 b = 15167458 (25.05.2011 10:10:23)、15161211 (10.08.2012 12:15:22) 的 var b
  • @cosmin 将(?&lt;!\d\.) 替换为(?&lt;!\d[.:]),将(?!\.?\d) 替换为(?![.:]?\d)。见this regex demo
  • @cosmin 我添加了一个不同的解决方案,它也适用于您并且可能更灵活,因为您可以添加更多上下文异常。
  • 您能帮我比较两个列表吗?我的意思是,如果一个或另一个有不同的东西(可能是一个数字),那么打印会说明差异,否则 2 是相等的。@wiktor
  • @cosmin 这听起来像是一个新问题。无论如何,不​​清楚您需要做什么以及您引用的两个列表。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-01-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-20
相关资源
最近更新 更多