我是一个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
我需要我的代码能够解释那些通配符/控制字符,打印以下内容:
谢谢!
编辑:供将来参考(如果有人遇到同样的问题),这就是我在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
答案 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的字符串对象确实有startswith
和endswith
方法,如果您只有少量规则,可以在此处使用。最常见的方法是,因为你似乎有相当简单的模式,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