Python Dictreader和正则表达式,索引问题
嘿,我有一个问题,从我的列表中创建一个与正则表达式匹配的所有字符串的列表,以及与DictReader关联的字段名 我在一个字符串数组中循环,并尝试查看每个字符串是否匹配一个模式:Python Dictreader和正则表达式,索引问题,python,dictionary,arraylist,Python,Dictionary,Arraylist,嘿,我有一个问题,从我的列表中创建一个与正则表达式匹配的所有字符串的列表,以及与DictReader关联的字段名 我在一个字符串数组中循环,并尝试查看每个字符串是否匹配一个模式: reader = csv.DictReader(file) for mystr in reader: for i in range(len(mystr)): if re.search(pattern, list(mystr.values())[i]):
reader = csv.DictReader(file)
for mystr in reader:
for i in range(len(mystr)):
if re.search(pattern, list(mystr.values())[i]):
data.append([list(reader.fieldnames)[i],list(mystr.values())[i]])
当字符串与模式匹配时,它会将匹配的字符串和csv字段名附加到列表中
这是可行的,但是在正确且预期匹配的正则表达式值后面附加一个看似随机的字段名似乎有问题
也就是说,如果我的数据是订购的
名称、位置、价格
有时,正则表达式中的if条件会将字段名位置附加到与price关联的数值上。而且它似乎没有可预测的模式,关于哪个价值是关联的
结果:
第一项、第二项、第三项、第四项、第27项、第五项、第201项
[firstitem'、[1']、[seconditem']、[thirditem'、[12']、[fourthitem'、[fifthitem']
等等
这些数字都是以正确的顺序出现的,只是它们没有按照我能理解的模式/顺序对齐,所以我不确定它们为什么看起来有些随机。任何帮助都将不胜感激。我认为您可以像这样简化代码:
reader = csv.DictReader(file)
for mystr in reader:
for fieldname, value in mystr.items():
if re.search(pattern, value):
data.append([fieldname, value])
这样,更容易理解…我认为您可以像这样简化代码:
reader = csv.DictReader(file)
for mystr in reader:
for fieldname, value in mystr.items():
if re.search(pattern, value):
data.append([fieldname, value])
通过这种方式,更容易理解…给定一个完全人为的csv,如下所示(另存为“test.csv”): 然后,以下内容应提取包含整数的所有列:
>>> def get_items(pattern, csv_file):
with open(csv_file) as file:
for entry in csv.DictReader(file):
for field_name, value in entry.items():
if re.search(pattern, value):
yield [field_name, value]
>>> data = list(get_items(r'\d+', 'test.csv'))
[[' thirditem', ' 1'], [' thirditem', ' 2']]
或者,您可以使用
if value.strip().isdigit()
作为条件语句,而不必使用正则表达式。给定一个完全人为的csv,如以下所示(另存为“test.csv”):
然后,以下内容应提取包含整数的所有列:
>>> def get_items(pattern, csv_file):
with open(csv_file) as file:
for entry in csv.DictReader(file):
for field_name, value in entry.items():
if re.search(pattern, value):
yield [field_name, value]
>>> data = list(get_items(r'\d+', 'test.csv'))
[[' thirditem', ' 1'], [' thirditem', ' 2']]
或者,您可以使用
if value.strip().isdigit()
作为条件语句,而不必使用正则表达式。文件的内容是什么,您希望数据列表是什么样的?另外,我不认为您是“在字符串数组中循环”。“for mystr in reader”循环中的“mystr”将是一个字典,而不是str。确定两个内容都是字符串,是的,这是一个字典,我正在循环并尝试将每个元素与正则表达式匹配,csv的内容基本上是5列字符串,其中3列是唯一的值,我正在与正则表达式匹配,因为它们是日期、价格和时间格式,但目前我只是匹配价格,一个标准整数,文件的内容是什么,以及您希望数据列表是什么样子?此外,我不认为您是在“循环遍历字符串数组”。“for mystr in reader”循环中的“mystr”将是一个字典,而不是str。确定两个内容都是字符串,是的,这是一个字典,我正在循环并尝试将每个元素与正则表达式匹配,csv的内容基本上是5列字符串,其中3列是唯一的值,我与正则表达式匹配,因为它们是日期、价格和时间格式,但目前我只是匹配价格,一个标准整数