我正在尝试使用原始正则表达式来帮助我查找和下载文件。因此,我想知道为什么以下代码不起作用?我知道re.findall创造了一个物体,我想象这就是我误入歧途的地方。一如既往地谢谢。
server_list1=('part002.csv.gz' , '2014-01-28', 'part001.csv.gz', '2014-01-28', 'part002.csv.gz', '2014-01-25')
x=[]
for item in server_list1:
if re.findall(r'gz', item ) == 1 :
x.append(item)
答案 0 :(得分:4)
是的,re.findall
返回一个对象(就像Python中的所有内容一样)。但是,该对象是匹配列表,它永远不会等于整数1
。
由于空列表在Python中评估为False
,因此您只需执行以下操作即可解决问题:
if re.findall(r'\.gz$', item):
以下是演示:
>>> import re
>>> server_list1=('part002.csv.gz' , '2014-01-28', 'part001.csv.gz', '2014-01-28', 'part002.csv.gz', '2014-01-25')
>>> x=[]
>>> for item in server_list1:
... if re.findall(r'\.gz$', item):
... x.append(item)
...
>>> x
['part002.csv.gz', 'part001.csv.gz', 'part002.csv.gz']
>>>
另外,您会注意到我将您的正则表达式模式更改为\.gz$
而不是gz
。新模式将匹配字符串末尾的.gz
,而不是字符串中任何位置的gz
。
但是,正如下面提到的@krait,你绝不应该使用re.findall
来测试单个字符串是否包含模式。相反,您应该使用re.search
:
>>> import re
>>> server_list1=('part002.csv.gz' , '2014-01-28', 'part001.csv.gz', '2014-01-28', 'part002.csv.gz', '2014-01-25')
>>> x=[]
>>> for item in server_list1:
... if re.search(r'\.gz$', item):
... x.append(item)
...
>>> x
['part002.csv.gz', 'part001.csv.gz', 'part002.csv.gz']
>>>
或者,在这种情况下更好,完全摆脱正则表达式并使用str.endswith
:
>>> server_list1=('part002.csv.gz' , '2014-01-28', 'part001.csv.gz', '2014-01-28', 'part002.csv.gz', '2014-01-25')
>>> x=[]
>>> for item in server_list1:
... if item.endswith('.gz'):
... x.append(item)
...
>>> x
['part002.csv.gz', 'part001.csv.gz', 'part002.csv.gz']
>>>
答案 1 :(得分:3)
尝试删除== 1
,如下所示:
for item in server_list1:
if re.findall(r'gz', item ) :
x.append(item)
# x => ['part002.csv.gz', 'part001.csv.gz', 'part002.csv.gz']
在旁注中,您的正则表达式将匹配输入字符串中的gz
任何位置。要确保字符串以gz
结尾,请使用结束锚$
),如gz$
或\.gz$
中所示,如果您想确保它以{{1}结尾}}
答案 2 :(得分:1)
针对特定问题使用最实用的方法。这根本不需要正则表达式匹配。
server_list1 = ('part002.csv.gz' , '2014-01-28', 'part001.csv.gz', '2014-01-28', 'part002.csv.gz', '2014-01-25')
x = []
for item in server_list1:
if item.endswith('.gz'):
x.append(item)
或者更简洁:
x = filter((lambda item: item.endswith('.gz')), server_list1)
仅使用in
运算符或指定的正则表达式(而不是r'\.gz$'
)将错误地匹配figz.png
,例如。
您似乎也将异构数据存储在单个元组中。首先,我建议您使用列表,因为这更适合处理可变数量的记录。其次,使您的数据统一:使用元组列表,如:
[('part002.csv.gz', '2014-01-28'), ('part001.csv.gz', '2014-01-28'), ('part002.csv.gz', '2014-01-25')]
这样,您可以确保所有文件名都存储在第一个元组索引中,并且所有日期都存储在第二个元组索引中。给定server_list1
,上述结构可以用:
data = zip(server_list1[::2], server_list1[1::2])