2

我是一个 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”结尾的每一行。

谢谢!


编辑:供将来参考(以防有人遇到同样的问题),这就是我按照罗马建议解决问题的方法:

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
4

2 回答 2

2

试试re 模块

您可能需要准备使用正则表达式 (regex),方法是将 '*' 替换为 '.*' 并将 ^(字符串的开头)和 $(字符串的结尾)添加到正则表达式的开头和结尾。此外,您可能需要通过 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 文件,而指示符来自列表。反过来很容易做到这一点)。

上面的例子是例子。您仍然需要将它们调整到您的程序中。

于 2013-09-17T18:55:01.297 回答
0

Python 的字符串对象确实有一个startswith和一个endswith方法,如果你只有少量的规则,你可以在这里使用它。由于您似乎有相当简单的模式,因此最通用的方法是正则表达式。这样您就可以将这些规则编码为模式。

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
于 2013-09-17T18:41:13.143 回答