Python正则表达式:如何从变量中提取特定数字

4

我有以下问题:

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

我希望您能提供一个正则表达式,以提取以下数字:15159970、15615115、11224455和55441123。

目前为止,我有:

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

仅提取前两个数字:15159970、15615115。

同时还有第二个变量 b = 15159970、15615115、11224455、55441126,我希望比较这两个变量,如果它们不同,则输出“vars are different!”。

谢谢!


问题出在你表达式中的左括号。这个模式只出现了两次。 - Jan
2
您可以使用以下正则表达式查找在 .( 前面没有出现的数字: 正则表达式: (?<![(.])\b(\d+)\b - Chris Doyle
我之前使用的是 (\d+)(?:\s+|,|\n|$),只匹配后面跟着:换行符、空格、逗号或行尾的模式。但我认为 @ChrisDoyle 建议的更好。 - naurel
这个回答解决了你的问题吗?正则表达式匹配文本,但不包含在括号中 - naurel
不,匹配文本但不包含在括号中的正则表达式并不能回答这个问题,标准不仅仅是跳过所有括号内的内容。即使那是唯一的标准,链接线程中的答案实际上也无法适用于所有情况,而我的解决方案可以。 - Wiktor Stribiżew
1个回答

2
您可以提取所有数字块,这些数字块不是由数字或数字+点号前导,并且不是由点号+数字或数字后跟的:
(?<!\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+)` 匹配:
  • \([^()]+\) - 匹配任意一个字符(含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,其中 b = 15167458 (25.05.2011 10:10:23),15161211 (10.08.2012 12:15:22)。 - cosmin
@cosmin 将 (?<!\d\.) 替换为 (?<!\d[.:]),将 (?!\.?\d) 替换为 (?![.:]?\d)。请参见 此正则表达式演示 - Wiktor Stribiżew
1
@cosmin 我添加了一个不同的解决方案,它也适用于您,并且可能更灵活,因为您可以添加更多的上下文异常。 - Wiktor Stribiżew
你能帮我比较这两个列表吗?我的意思是,如果其中一个和另一个有所不同(可能是数字),那么输出就会显示它们之间的差异,否则它们就是相等的。 - cosmin
@cosmin 这听起来像是一个新问题。无论如何,现在不清楚你需要做什么以及你所指的两个列表是什么。 - Wiktor Stribiżew

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接