Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何根据access.log的格式配置生成与之匹配的正则表达式?_Python_Regex_Apache_Logging_Nginx - Fatal编程技术网

Python 如何根据access.log的格式配置生成与之匹配的正则表达式?

Python 如何根据access.log的格式配置生成与之匹配的正则表达式?,python,regex,apache,logging,nginx,Python,Regex,Apache,Logging,Nginx,access.log格式配置可能类似于 '$remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent"' 有没有办法根据它生成与access.log匹配的正则表达式?我可以根据实际日志编写正则表达式,如: '112.3.194.120 - - [17/Jan/2015:20:07:34 +0800] "GET /Introdctio

access.log格式配置可能类似于

'$remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent"'
有没有办法根据它生成与access.log匹配的正则表达式?我可以根据实际日志编写正则表达式,如:

'112.3.194.120 - - [17/Jan/2015:20:07:34 +0800] "GET /Introdction%20to%20Guitar/1%20-%202%20-%20Choosing%20the%20Right%20Guitar-%20Right-Handed%20vs%20Left-Handed%20(3-20).mp4 HTTP/1.1" 206 546849 "http://example.com/video/302/" "Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.63 Safari/537.36"'

但是我不能用格式config编写正则表达式。有人能帮忙吗?

若要从配置中构建表达式,请将$xxx之类的配置变量替换为?p.*之类的命名组?和转义分隔符字符:

import re

conf = '$remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent"'
regex = ''.join(
    '(?P<' + g + '>.*?)' if g else re.escape(c)
    for g, c in re.findall(r'\$(\w+)|(.)', conf))
在matchObject.groupdict中捕获变量:

结果:

{'body_bytes_sent': '546849',
 'http_referer': 'http://example.com/video/302/',
 'http_user_agent': 'Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.63 Safari/537.36',
 'remote_addr': '112.3.194.120',
 'remote_user': '-',
 'request': 'GET /Introdction%20to%20Guitar/1%20-%202%20-%20Choosing%20the%20Right%20Guitar-%20Right-Handed%20vs%20Left-Handed%20(3-20).mp4 HTTP/1.1',
 'status': '206',
 'time_local': '17/Jan/2015:20:07:34 +0800'}
如果日志配置中没有分隔符,则必须使用更具体的子模式,而不仅仅是。*。这可以用如下类似的方式优雅地编码:

# variable-specific patterns
patterns = {
    'remote_addr': r'(\d{1,3}\.){3}\d{1,3}',
    'body_bytes_sent': r'\d+',
    # etc
}

regex = ''.join(
    '(?P<%s>%s)' % (g, patterns.get(g, '.*?')) if g
        else re.escape(c)
    for g, c in re.findall(r'\$(\w+)|(.)', conf))

要从配置中构建表达式,请将$xxx之类的配置变量替换为?p.*?和转义分隔符字符:

import re

conf = '$remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent"'
regex = ''.join(
    '(?P<' + g + '>.*?)' if g else re.escape(c)
    for g, c in re.findall(r'\$(\w+)|(.)', conf))
在matchObject.groupdict中捕获变量:

结果:

{'body_bytes_sent': '546849',
 'http_referer': 'http://example.com/video/302/',
 'http_user_agent': 'Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.63 Safari/537.36',
 'remote_addr': '112.3.194.120',
 'remote_user': '-',
 'request': 'GET /Introdction%20to%20Guitar/1%20-%202%20-%20Choosing%20the%20Right%20Guitar-%20Right-Handed%20vs%20Left-Handed%20(3-20).mp4 HTTP/1.1',
 'status': '206',
 'time_local': '17/Jan/2015:20:07:34 +0800'}
如果日志配置中没有分隔符,则必须使用更具体的子模式,而不仅仅是。*。这可以用如下类似的方式优雅地编码:

# variable-specific patterns
patterns = {
    'remote_addr': r'(\d{1,3}\.){3}\d{1,3}',
    'body_bytes_sent': r'\d+',
    # etc
}

regex = ''.join(
    '(?P<%s>%s)' % (g, patterns.get(g, '.*?')) if g
        else re.escape(c)
    for g, c in re.findall(r'\$(\w+)|(.)', conf))

最简单的选择是将每一美元后面的字母替换为.+?@georg,但是你能知道哪个是远程地址,哪个是本地时间吗?我需要对它们进行分类。您可以为此使用命名组:?P.+?-?P.+?等等@georg我知道我应该使用regex group,但是如果remote_addr和remote_user的顺序改变了,或者格式配置只有$http_user_agent,没有其他变量?如何编写正则表达式?我不认为这是一个简单的问题,但我不明白为什么这么多人点击向下按钮…当我回头看这个问题时,我认为有更好的方法使日志易于解析jsonify!最简单的选择是将每一美元后面的字母替换为.+?@georg,但是你能知道哪个是远程地址,哪个是本地时间吗?我需要对它们进行分类。您可以为此使用命名组:?P.+?-?P.+?等等@georg我知道我应该使用regex group,但是如果remote_addr和remote_user的顺序改变了,或者格式配置只有$http_user_agent,没有其他变量?如何编写正则表达式?我不认为这是一个简单的问题,但我不明白为什么这么多人点击向下按钮…当我回头看这个问题时,我认为有更好的方法使日志易于解析jsonify!谢谢,这对我很有帮助。但我仍然想知道日志格式配置是否像$remote\u addr$remote\u user$time\u local$request$status$body\u bytes\u sent$http\u referer$http\u user\u agent?正则表达式还能帮上忙吗?你必须更具体一些,而不仅仅是。*?然后为每个配置变量使用专用表达式,例如,IP地址为\d{1,3}\.{3}\d{1,3},发送的字节为\d+。谢谢,这对我帮助很大。但我仍然想知道日志格式配置是否像$remote\u addr$remote\u user$time\u local$request$status$body\u bytes\u sent$http\u referer$http\u user\u agent?正则表达式还能帮上忙吗?你必须更具体一些,而不仅仅是。*?然后为每个配置变量使用专用表达式,例如,IP地址为\d{1,3}\.{3}\d{1,3},发送字节为\d+。