python正则表达式基础知识

时间:2014-01-29 19:52:18

标签: python regex

我正在尝试使用原始正则表达式来帮助我查找和下载文件。因此,我想知道为什么以下代码不起作用?我知道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)

3 个答案:

答案 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])