我有以下文字
状态指示器: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)
答案 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)