使用正则表达式从字符串输出中获取文件名

时间:2017-09-25 22:17:56

标签: python regex python-2.7

我输出了字符串,我需要解析一个特定的文件名:

>>> a = "Warning: do not enter your password if anyone else has superuser privileges or access to your account. [1] 15:04:16 [SUCCESS] 1.1.1.1 abc330b125.tar.bz2 my-libs.tar.bz2 xyz-notok-0.tar.gz Stderr: Could not create directory '/usr/share/httpd/.ssh'. Failed to add the host to the list of known hosts (/usr/share/httpd/.ssh/known_hosts)."

我尝试了这一点,但我没有获得abc330b125.tar.bz2,而是获得了bs.tar.bz2

>>> re.findall(r'.*([abc|xyz\-ok|!my].*.tar.bz2)', a)
['bs.tar.bz2']

如果我在这里犯了任何错误,有人可以告诉我吗?

4 个答案:

答案 0 :(得分:0)

我得到了答案:

>>> re.findall(r'(?:abc.*\d+.tar.bz2|xyz\-ok.*.tar.bz2)', a)
['abc330b125.tar.bz2']

答案 1 :(得分:0)

您可以使用此正则表达式:

re.findall(r"[\w-]+\.tar.bz2",a)

结果

# ['abc330b125.tar.bz2', 'my-libs.tar.bz2']

如果你想要所有的文件名,你可以这样做:

re.findall(r"[\w-]+\.tar.(bz2|gz)",a)

结果

# ['abc330b125.tar.bz2', 'my-libs.tar.bz2', 'xyz-notok-0.tar.gz' ]

答案 2 :(得分:0)

您正在使用“findall”,因此我假设您要查找所有tar文件。如果是这样的话,这将有效:

re.findall('\S*\.tar\.bz2', a)

['abc330b125.tar.bz2', 'my-libs.tar.bz2']

如果你只想找到以“abc”开头的,只包含字母和数字的那些,你可以使用这个:

re.findall('abc\w*\.tar\.bz2', a)

['abc330b125.tar.bz2']

答案 3 :(得分:-1)

我尝试使用regex101.com(用于测试正则表达式的真棒网站)进行一些测试,看起来这个正则表达式:

[a-zA-Z0-9-_]*(.)(tar)(.)(bz2)

捕捉你所要求的东西。

我相信你已经知道,但对于任何想要澄清的人来说:抓住实际的“。”在字符串中,您需要将它们括在括号中。

希望这有帮助!