在python中编写正则表达式时,我很挣扎。 例如,我有以下权利
"GET /images/launch-logo.gif HTTP/1.0" 220 1839
与
匹配"(\S+) (\S+)\s*(\S*)" (\d{3}) (\S+)
但是我仍然需要将以下几种情况都包括在内
"GET /history/history.html hqpao/hqpao_home.html
HTTP/1.0" 200 1502
"GET /shuttle/missions/missions.html Shuttle Launches from
Kennedy Space Center HTTP/1.0"200 8677
"GET /finger @net.com HTTP/1.0"404 -
很明显,我应该更改表达式的粗体部分
"(\S+) (\S+)\s*(\S*)" (\d{3}) (\S+)
但是我应该如何更改它。我想到的一种方法是将粗体部分更改为
[\s |(\s*)(\S+) |(\S+)(12) |(\S+)]
其中第二,第三,第四表达式是我需要处理的(1),(2),(3)额外情况。
但是我的表情不起作用。我对正则表达式的误解是因为我仅视情况而定。
答案 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个或多个非空白字符$
-字符串的结尾。