python

时间:2018-11-11 10:20:54

标签: python regex

在python中编写正则表达式时,我很挣扎。 例如,我有以下权利

"GET /images/launch-logo.gif HTTP/1.0" 220 1839

匹配
"(\S+) (\S+)\s*(\S*)" (\d{3}) (\S+)

但是我仍然需要将以下几种情况都包括在内

  1. "GET /history/history.html hqpao/hqpao_home.html HTTP/1.0" 200 1502
  2. "GET /shuttle/missions/missions.html Shuttle Launches from Kennedy Space Center HTTP/1.0"200 8677
  3. "GET /finger @net.com HTTP/1.0"404 -

很明显,我应该更改表达式的粗体部分

"(\S+) (\S+)\s*(\S*)" (\d{3}) (\S+)

但是我应该如何更改它。我想到的一种方法是将粗体部分更改为

[\s |(\s*)(\S+) |(\S+)(12) |(\S+)]

其中第二,第三,第四表达式是我需要处理的(1),(2),(3)额外情况。

但是我的表情不起作用。我对正则表达式的误解是因为我仅视情况而定。

2 个答案:

答案 0 :(得分:1)

这可能有点混乱,但它可以起作用:

\"(\S+) (\S+[\s\w\.\@]*)\s*(\S*)\"\s?(\d{3})\s(\S+)*

您可以在Regexr上玩它。 Regexr Shared Link

答案 1 :(得分:0)

您可以使用

^"([^\s"]+)\s+([^\s"]+)(?:\s+([^"]+?))?\s+([A-Z]+/\d[\d.]*)"\s*(\d{3})\s*(\S+)$

请参见regex demo

详细信息

  • ^-行的开头(如果要将整个文件读入变量re.M,请使用f.read()
  • "-双引号
  • ([^\s"]+)-第1组:除空格和双引号之外的一个或多个字符
  • \s+-超过1个空格
  • ([^\s"]+)-第2组:除空格和双引号之外的一个或多个字符
  • (?:\s+([^"]+?))?-可选的非捕获组匹配
    • \s+-超过1个空格
    • ([^"]+?)-第3组:"以外的任何1个或更多字符,请尽可能少
  • \s+-超过1个空格
  • ([A-Z]+/\d[\d.]*)-第4组:1+个大写字母,/,然后是1位数字,后跟任意0+位数字或.字符
  • "-双引号
  • \s+-超过0个空格
  • (\d{3})-第5组:三位数
  • \s*-超过0个空格
  • (\S+)-1个或多个非空白字符
  • $-字符串的结尾。