python-3.x - 如何将多个正则表达式编译为一个
问题描述
早上好,我需要将几个正则表达式编译成一个模式正则表达式是这样的:
reg_ip = r'(?P<IP>\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})'
reg_meth = r'(?P<METHOD>GET|POST|PUT|DELETE|HEAD)'
reg_status = r'\s(?P<STATUS>20[0-9]|30[0-9]|40[0-9]|50[0-9])\s'
reg_400 = r'\s(?P<STATUS_400>40[0-9])\s'
reg_500 = r'\s(?P<STATUS_500>50[0-9])\s'
reg_url = r'"(?P<URL>htt[p|ps]:.*?)"'
reg_rt = r'\s(?P<REQ_TIME>\d{4})$'
为 apache access.log 中的字符串编写正则表达式:
109.169.248.247 - - [12/Dec/2015:18:25:11 +0100] "POST /administrator/index.php HTTP/1.1" 200 4494 "http://almhuette-raith.at/administrator/" "Mozilla /5.0 (Windows NT 6.0; rv:34.0) Gecko/20100101 Firefox/34.0" 4374
试图用这样的代码编译它:
some_pattern = re.compile(reg_ip.join(reg_meth).join(reg_status))
显然它不是那样工作的。怎么做才对?
解决方案
你需要一些正则表达式之间的粘合剂。
你有两个选择:
- 通过交替加入正则表达式:
regex1|regex2|regex3|...
并使用全局搜索 - 添加缺少的粘合 betweek 正则表达式:例如,在 reg_status 和 reg_url 之间,您可能需要添加
r'[^"]+'
以跳过下一个数字
交替的问题是你可以在任何地方找到正则表达式。post
因此,您可以在 url 中找到例如单词(或数字)。
所以对我来说,第二种选择更好。
这是我会使用的胶水:
import re
reg_ip = r'(?P<IP>\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})'
reg_meth = r'(?P<METHOD>GET|POST|PUT|DELETE|HEAD)'
reg_status = r'\s(?P<STATUS>20[0-9]|30[0-9]|40[0-9]|50[0-9])\s'
#reg_400 = r'\s(?P<STATUS_400>40[0-9])\s'
#reg_500 = r'\s(?P<STATUS_500>50[0-9])\s'
reg_url = r'"(?P<URL>https?:[^"]+)"'
reg_rt = r'\s(?P<REQ_TIME>\d{4})$'
some_pattern = re.compile(reg_meth + r'\s+[^]]+\s*"' + reg_status + r'[^"]+' + reg_url + r'\s*"[^"]+"\s*' + reg_rt)
print(some_pattern)
line = '109.169.248.247 - - [12/Dec/2015:18:25:11 +0100] "POST /administrator/index.php HTTP/1.1" 200 4494 "http://almhuette-raith.at/administrator/" "Mozilla/5.0 (Windows NT 6.0; rv:34.0) Gecko/20100101 Firefox/34.0" 4374'
print(some_pattern.search(line))
对于胶水,这些是我使用的部分:
\s* : Capture any 'whitespace' 0 or more times
\s+ : Capture any 'whitespace' 1 or more times
[^X]+ : Where 'X' is some character; Capture any non-X characters one or more times
顺便一提:
这htt[p|ps]
是不正确的。您可以简单地使用https?
。或者如果你想用组来做:htt(p|ps)
或者http(?:p|ps)
(最后一个是非捕获组,如果你不想捕获它的内容,这是首选)
推荐阅读
- sharepoint - 如何更新没有 ID 列的 SharePoint 列表项
- go - golang 使用 sort.Search 查找小于或等于给定元素的第一个元素
- javascript - 为 Vue.js 保存到本地存储时出错
- perl - 这两个数组声明有什么区别?
- javascript - 没有 else 的三元 if 语句不能与 && 一起使用
- html - 属性选择器没有对 css 进行任何更改
- regex - 如何将过滤器公式创建为数组公式
- angular - Composer-rest-server 在客户端应用程序中自动执行身份验证
- python-3.x - 包含与不包含的区别 [:]
- python - 如何在 Visual Studio Code 中隐藏/灰显日志代码(例如:Python)