我需要编写一个脚本来扫描亚马逊的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]}`,所有可能的组合,但字母总是在数字之后。
答案 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'