【问题标题】:Get a file name from string output using regular expression使用正则表达式从字符串输出中获取文件名
【发布时间】:2017-09-25 22:17:55
【问题描述】:

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

>>> 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']

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

【问题讨论】:

  • 方括号创建的字符集将仅匹配其中包含的一个字符。模式 [abc|xyz\-ok|!my] 匹配 a、b、c、k、m、o、x、y、z、-、! 或 |恰好一次。

标签: python regex python-2.7


【解决方案1】:

您正在使用“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']

【讨论】:

  • 它将只有一个我正在寻找的文件。谢谢!
  • @Sweety 注意[\w\d] = \w,你可以稍微“简化”一下模式。
【解决方案2】:

我得到了答案:

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

【讨论】:

    【解决方案3】:

    你可以使用这个正则表达式:

    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' ]
    

    【讨论】:

      【解决方案4】:

      我尝试使用 regex101.com(用于测试正则表达式的好网站)进行一些测试,似乎这个正则表达式:

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

      捕捉您的要求。

      我相信你已经知道了,但是对于任何可能想要澄清的人:捕获实际的“。”在字符串中,您需要将它们括在括号中。

      希望这会有所帮助!

      【讨论】:

      • (.). 相同,只是它创建了一个捕获组。 [.] 将匹配文字 .\. 也将匹配。
      • 哎呀,我的错。您将如何修正我的答案以使其更具相关性?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多