如何在一个特定模式中过滤特定值上的特定条目?

2024-09-30 12:35:33 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个包含以下信息的数据文件: 我感兴趣的是只检索模式

len:XXXX大于200

TY_DN106_c0_g2::TY_DN106_c0_g2_i1::g.1::m.1 type:internal len:123 gc:universal TY_DN106_c0_g2_i1:1-366(+) TY_DN106_c0_g2::TY_DN106_c0_g2_i1::g.2::m.2 type:internal len:213 gc:universal TY_DN106_c0_g2_i1:366-1(-) TY_DN108_c0_g1::TY_DN108_c0_g1_i1::g.3::m.3 type:5partial len:513 gc:universal TY_DN108_c0_g1_i1:3-341(+)

我如何用Python或其他脚本语言来实现它


Tags: 信息len数据文件typegcuniversal感兴趣internal
3条回答

以下是一个例子:

import re


file_path = 'file.txt'
pattern = r'len:\d{3,}'

with open(file_path, 'r', encoding='utf-8') as f:
    for line in f.readlines():
        if re.search(pattern, line):
            if int(re.search(pattern, line)[0].split(':')[1]) > 200:
                print(line)

如果您不想将结果写入新文件,请尝试以下操作:

import re


file_path = 'file.txt'
new_file_path = 'new_file.txt'
pattern = r'len:\d{3,}'

with open(file_path, 'r', encoding='utf-8') as f1:
    with open(new_file_path, 'w', encoding='utf-8') as f2:
        for line in f1.readlines():
            if re.search(pattern, line):
                if int(re.search(pattern, line)[0].split(':')[1]) > 200:
                    f2.write(line)

以下是@Henry Harutyunyan的regex示例:

import re


file_path = 'file.txt'
pattern = r'len:([2-9]\d{2}|[1-9]\d{3,})'

with open(file_path, 'r', encoding='utf-8') as f1:
    for line in f1.readlines():
        if re.search(pattern, line):
            print(line)

对于data.txt文件中的数据,如下所示:

TY_DN106_c0_g2::TY_DN106_c0_g2_i1::g.1::m.1 type:internal len:123 gc:universal
TY_DN106_c0_g2_i1:1-366(+)
TY_DN106_c0_g2::TY_DN106_c0_g2_i1::g.2::m.2 type:internal len:213 gc:universal
TY_DN106_c0_g2_i1:366-1(-)
TY_DN108_c0_g1::TY_DN108_c0_g1_i1::g.3::m.3 type:5partial len:513 gc:universal
TY_DN108_c0_g1_i1:3-341(+)

使用正则表达式: 1.找到合适的线路 2.提取数 3.将数字与条件进行比较

import re

data = open('data.txt', 'r').readlines()

for line in data:
    proper_row = re.findall('len:\d+', line.strip())
    if len(proper_row) > 0:
        number = re.findall('\d+', proper_row[0])[0]
        if int(number) > 200:
            print(line.strip())

输出:

TY_DN106_c0_g2::TY_DN106_c0_g2_i1::g.2::m.2 type:internal len:213 gc:universal
TY_DN108_c0_g1::TY_DN108_c0_g1_i1::g.3::m.3 type:5partial len:513 gc:universal

您可以使用len:([2-9]\d{2}|[1-9]\d{3,})regex获得所需的匹配项

如果要匹配整行,请使用以下命令:^.*len:([2-9]\d\d|[1-9]\d{3,}).*$


正则表达式解释

表达式的第一部分:len:与字符'len:'字面匹配

之后,在第一个捕获组中,我们有两个备选方案

第一个选项:[2-9]\d{2}匹配一个介于2和9之间的数字,后跟任意两位数,从而覆盖从200到999的所有数字

第二个选项:[1-9]\d{3,}匹配以数字1到9开头的所有字符,然后是其他3个数字,从而覆盖从1000到inf的所有整数,而不包括以0开头的数字字符

相关问题 更多 >

    热门问题