如何使用正则表达式提取字符串之间的数字

时间:2019-05-28 19:15:42

标签: python regex

我有以下文字

状态指示器:01245已加载值

一些不相关的数据

状态指示器:已加载13452个值

我的输出应该给我数字01245、13452

这是我尝试过的

with open('test.txt') as fd:
    data = fd.read()
val_to_pattern = {'stat': r'Stat indicator : .{5}\n'}
val_dict = {}
for key, patt in val_to_pattern.items():
    val_dict[key] = re.findall(patt, data)

3 个答案:

答案 0 :(得分:1)

使用

val_to_pattern = {'stat': r'Stat indicator\s*:\s*(\d+)'}

请注意,\s*:\s*模式与:匹配,并可选地用0+空格包裹,(\d+)部分匹配并且捕获 到组1中的任何0+数字(请注意,如果在正则表达式中设置了捕获组,re.findall仅返回捕获的子字符串。

请参见the regex demo(绿色文本将成为结果)。

或者,如果指标统计信息中的位数始终为5,则使用以下任一方法

 val_to_pattern = {'stat': r'Stat indicator\s*:\s*(\d{5})\b'}
 val_to_pattern = {'stat': r'Stat indicator\s*:\s*(\d{5})(?!\d)'}

\b是单词边界,需要5个数字后的非单词char或字符串结尾,而(?!\d)是一个负向查找,如果右边有一个数字,则匹配失败当前位置。

答案 1 :(得分:0)

您可以使用正则表达式\d,如果您知道数字的大小,则可以使用{size}

  

\ d {3}返回一个匹配项,其中字符串包含3位数字(从   0-9)

     

\ d {3,5}返回一个匹配,其中字符串包含3到5位数字   (数字从0-9)

因此您可以将r'\d{3,5}'用作正则表达式模式

import re

with open('test.txt') as fd:
    data = fd.read()
val_to_pattern = {'stat': r'\d{5}'}
val_dict = {}
for key, patt in val_to_pattern.items():
    re_find = re.findall(patt, data)
    val_dict[key] = re.findall(patt, data)

答案 2 :(得分:0)

如果您不想使用正则表达式,则可以实现一个简单的循环。

  1 with open('test.txt') as fd:
  2     data = fd.read()
  3
  4 nums = []
  5 temp = ""
  6 is_dig = False
  7 for char in data:
  8      if char.isdigit():
  9           temp += char
 10           is_dig = True
 11      elif is_dig:
 12           nums.append(temp)
 13           temp = ""
 14           is_dig = False
 15 print(nums)