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

2024-10-03 02:33:16 发布

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

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

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文件只是一个名称列表,如下所示:

^{pr2}$

我希望能够使用通配符,如*和.,例如:假设我把这个放在我的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

Tags: 文件csvinimportre名称列表for
2条回答

试试re module。在

您可能需要准备正则表达式(regex)以供使用,方法是将“*”替换为“.*”,并在正则表达式的开头和结尾添加^(字符串开头)和$(字符串结尾)。此外,您可能需要通过重新逃逸函数(即,函数从模块re中转义)。在

如果您没有任何其他“控制字符”(如您所称),请在应用escape后用“*”分隔字符串,并用“.*”连接。在

例如

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("*")) + "$")

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

^{pr2}$

(我了解到,规则来自CSV文件,而指示符来自列表。相反的方法很容易做到)。在

上面的例子就是例子。你仍然需要把它们调整到你的程序中。在

Python的string对象有一个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

相关问题 更多 >