在Python中使用正则表达式解析Amazon S3 URI?

时间:2014-02-21 18:39:41

标签: python regex amazon-s3

我需要编写一个脚本来扫描亚马逊的S3存储桶,寻找我们正在测试的软件的更新版本。 我也在使用s3cmd返回该存储桶的ls,输出如下:

                   DIR   s3://foo/versions/4.4.1.2/
                   DIR   s3://foo/versions/4.5.0.10a/
                   DIR   s3://foo/versions/4.5.0.11a/
                   DIR   s3://foo/versions/4.5.0.12a/
                   DIR   s3://foo/versions/4.5.0.13a/
在DIR面前有一些空白。我使用string.strip().split()将该字符串分解为标记,它看起来像:

[' ', 'DIR   s3://foo/versions/4.4.1.2/', 
'DIR   s3://foo/versions/4.5.0.10a/', 
'DIR   s3://foo/versions/4.5.0.11a/', 
'DIR   s3://foo/versions/4.5.0.12a/', 
'DIR   s3://foo/versions/4.5.0.13a/',
'2014-02-12 00:33  s3://foo/versions/\n']

我想要的是使用模块re并使用正则表达式解析该字符串,但我不确定如何生成只会产生版本的相应正则表达式。 我最后需要的是像[4.4.1.2, 4.5.0.10a]这样的版本数组。假设该版本的正则表达式为{d}* which would be {d}。{d}。{d}。{d} or {d} , or {d}。{d}。{ [AZ] [az]}`,所有可能的组合,但字母总是在数字之后。

3 个答案:

答案 0 :(得分:4)

如果您的版本始终位于versions/之后,那么您可以使用此示例:

input = '''
DIR   s3://foo/versions/4.4.1.2/
DIR   s3://foo/versions/4.5.0.10a/
DIR   s3://foo/versions/4.5.0.11a/
DIR   s3://foo/versions/4.5.0.12a/
DIR   s3://foo/versions/4.5.0.13a/
'''
print re.findall("versions/([^/]*)/", input)

答案 1 :(得分:1)

>>> import re

>>> string = "  DIR   s3://foo/versions/4.4.1.2/"
>>> version_pattern = re.compile(r'.*/versions/(.*)/')
>>> result = version_pattern.search(string)
>>> result.groups()[0]
>>> 4.4.1.2

答案 2 :(得分:0)

使用正则表达式:

pattern = r"DIR\s*s3://foo/versions/(?P<version>(\d\.){3}\d*[a-zA-Z]?)/"
versions = []
for match in re.finditer(pattern, s):
    versions.append(match.groups("version"))

您可以使用以下单行代码来代替使用正则表达式:

# s = your data
[line.split("/")[-2] for line in s.splitlines()]

说明:

>>> s.splitlines()
['DIR   s3://foo/versions/4.4.1.2/',
 'DIR   s3://foo/versions/4.5.0.10a/',
 'DIR   s3://foo/versions/4.5.0.11a/',
 'DIR   s3://foo/versions/4.5.0.12a/',
 'DIR   s3://foo/versions/4.5.0.13a/']

>>> _[0].split("/")
['DIR   s3:', '', 'foo', 'versions', '4.4.1.2', '']

>>> _[-2]
'4.4.1.2'