【问题标题】:Regular Expressions - testing if a String contains another String正则表达式 - 测试一个字符串是否包含另一个字符串
【发布时间】:2010-10-20 13:48:47
【问题描述】:

假设你有一些这个字符串(一行)

10.254.254.28 - - [06/Aug/2007:00:12:20 -0700] “获取 /keyser/22300/HTTP/1.0" 302 528 "-" "Mozilla/5.0 (X11; U; Linux i686 (x86_64); zh-CN;房车:1.8.1.4) 壁虎/20070515 火狐/2.0.0.4"

并且您想要提取 GET 和 HTTP 之间的部分(即某个 url),但前提是它包含单词“puzzle”。你会如何在 Python 中使用正则表达式来做到这一点?

到目前为止,这是我的解决方案。

match = re.search(r'GET (.*puzzle.*) HTTP', my_string)

它有效,但我有一些想法,我必须将第一个/第二个/两个 .* 更改为 .*? 以使它们不贪婪。在这种情况下真的重要吗?

【问题讨论】:

  • 只希望您的服务器管理员不要更改日志格式:)

标签: python regex string


【解决方案1】:

不需要正则表达式

>>> s
'10.254.254.28 - - [06/Aug/2007:00:12:20 -0700] "GET /keyser/22300/ HTTP/1.0" 302 528 "-" "Mozilla/5.0 (X11; U; Linux i686 (x86_64); en-US; rv:1.8.1.4) Gecko/20070515 Firefox/2.0.0.4"'

>>> s.split("HTTP")[0]
'10.254.254.28 - - [06/Aug/2007:00:12:20 -0700] "GET /keyser/22300/ '

>>> if "puzzle" in s.split("HTTP")[0].split("GET")[-1]:
...   print "found puzzle"
...

【讨论】:

    【解决方案2】:

    这很重要。 User-Agent 可以包含任何东西。对它们都使用非贪婪。

    【讨论】:

    • 在目前的形式中,只有在一行中有多个 GET-HTTP 字符串时才重要,我怀疑永远不会有。让它不贪婪会是更安全的选择。
    【解决方案3】:
    >>> s = '10.254.254.28 - - [06/Aug/2007:00:12:20 -0700] "GET /keyser/22300/ HTTP/1.0" 302 528 "-" "Mozilla/5.0 (X11; U; Linux i686 (x86_64); en-US; rv:1.8.1.4) Gecko/20070515 Firefox/2.0.0.4"'
    >>> s.split()[6]
    '/keyser/22300/'
    

    【讨论】:

    • 日志消息有时会在两个破折号之间包含非空白内容,这会导致拆分中的索引失效。
    猜你喜欢
    • 1970-01-01
    • 2021-04-24
    • 1970-01-01
    • 1970-01-01
    • 2019-06-22
    • 2015-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多