在Python中读取文本文件时如何使用正则表达式?

时间:2016-09-07 21:57:07

标签: python python-2.7 python-3.x

我想举个例子。如果我尝试从文件中打印包含整数-9999的行。

19940325       78     -28   -9999
19940326       50      17     102
19940327      100     -11   -9999
19940328       56     -33       0
19940329       61     -39   -9999
19940330       61     -56       0
19940331      139     -61   -9999
19940401      211       6       0

这是我的代码,它使用正则表达式来读取文本文件并扫描以查找整数-9999并仅打印包含该整数的行/行。

import re

file= open("USC00110072.txt", "r")


for line in file.readlines():
    if re.search('^-9999$', line, re.I):
        print line

我的代码运行时出错,但输出中没有显示任何内容。请让我知道我犯了什么错误。

3 个答案:

答案 0 :(得分:3)

正则表达式可能有点过分,使用in运算符进行简单的子字符串检查似乎已足够

with open("USC00110072.txt") as f:
    for line in f:
        if '-9999' in line:
            print(line)

或者,如果您担心将其匹配为"整个单词"你可以多做一点来划分价值

with open("USC00110072.txt") as f:
    for line in f:
        if '-9999' in line.strip().split('\t'):
            print(line)

答案 1 :(得分:1)

您可以使用filter

with open(fn) as f:
    print filter(lambda line: '-9999' in line.split()[-1], f)

这将检查'-9999'是否在该行的最后一列。

如果你想使用正则表达式:

with open(fn) as f:
    for line in f:
        if re.search(r'-9999$', line): # remove $ if the -9999 can be anywhere in the line
            print line.strip()

除了仅包含^的行外,您所拥有的-9999将永远不会匹配。 ^表示该行的开头。

或者,只需使用in来测试字符串的存在:

with open(fn) as f:
    for line in f:
        if '-9999' in line:
            print line.strip()

答案 2 :(得分:1)

或者,由于您有一个csv文件,您可以使用csv模块:

import csv
import io

file = io.StringIO(u'''
19940325\t78\t-28\t-9999
19940326\t50\t17\t102
19940327\t100\t-11\t-9999
19940328\t56\t-33\t0
19940329\t61\t-39\t-9999
19940330\t61\t-56\t0
19940331\t139\t-61\t-9999
19940401\t211\t6\t0
'''.strip())

reader = csv.reader(file, delimiter='\t')
for row in reader:
    if row[-1] == '-9999':   # or, for regex, `re.match(r'^-9999$', row[-1])`
        print('\t'.join(row))