从文件中读取并正确理解/解释控制字符(python)

时间:2013-09-17 18:31:02

标签: python csv controls character

我是一个python初学者,刚遇到一个简单的问题:我有一个名称列表(指示符),然后是一个非常简单的代码,它读取csv文件中的行并打印出具有名称的csv行第一列(row [0])与我的“指示符列表”相同。所以:

import csv

DesignatorList = ["AAX-435", "AAX-961", "HHX-9387", "HHX-58", "K-58", "K-14", "K-78524"]

with open('DesignatorFile.csv','rb') as FileReader:
    for row in csv.reader(FileReader, delimiter=';'):
        if row[0] in DesignatorList:
            print row

我的csv文件只是一个名单列表,如下所示:

AAX-435
AAX-961
HHX-58
HHX-9387

我希望能够使用*和。之类的通配符,例如:假设我把它放在我的csv文件中:

AAX*
H.X-9387
*58

我需要我的代码能够解释那些通配符/控制字符,打印以下内容:

  • 以“AAX”开头的每一行;
  • 每行以“H”开头,然后是任何后续字符,最后以“X-9387”结束;
  • 以“58”结尾的每一行。

谢谢!


编辑:供将来参考(如果有人遇到同样的问题),这就是我在Roman建议后解决问题的方法:

import csv
import re
DesignatorList = ["AAX-435", "AAX-961", "HHX-9387", "HHX-58", "K-58", "K-14", "K-78524"]
with open('DesignatorFile.txt','rb') as FileReader:
    for row in csv.reader(FileReader, delimiter=';'):
        designator_col0 = row[0]
        designator_col0_re = re.compile("^" + ".*".join(re.escape(i) for i in designator_col0.split("*")) + "$")
        for d in DesignatorList:
            if designator_col0_re.match(d):
                print d

2 个答案:

答案 0 :(得分:2)

尝试re module

您可能需要准备正则表达式(正则表达式),方法是将'*'替换为'。*'并将^(字符串的开头)和$(字符串的结尾)添加到常规的开头和结尾表达。另外,你可能需要通过re.escape函数来逃避其他一切(也就是说,函数从模块re中逃逸)。

如果您没有任何其他“控制字符”(如您所说),请在应用转义后将字符串拆分为“*”并加“。*”。

例如,

import re
def make_rule(rule):  # where rule for example "H*X-9387" 
   return re.compile("^" + ".*".join(re.escape(i) for i in rule.split("*")) + "$")

然后你可以匹配(我猜你的规则是行):

...
rule_re = make_rule(row)
for d in DesignatorList:
    if rule_re.match(d):
        print row  # or maybe print d

(我已经理解,规则来自CSV文件,而指定者来自列表。反过来很容易做到。)

以上示例是示例。你仍然需要让它们适应你的程序。

答案 1 :(得分:0)

Python的字符串对象确实有startswithendswith方法,如果您只有少量规则,可以在此处使用。最常见的方法是,因为你似乎有相当简单的模式,regular expressions。这样您就可以将这些规则编码为模式。

import re
rules = ['^AAX.*$', # starts with AAX
         '^H.*X-9387$', # starts with H, ends with X-9387
         '^.*58$'] # ends with 58

for line in reader:
    if any(re.match(rule, line) for rule in rules):
        print line