Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.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和正则表达式_Python_Regex - Fatal编程技术网

Python和正则表达式

Python和正则表达式,python,regex,Python,Regex,大家好 我之前发布了类似的内容,所以如果您再次遇到此问题,我向您道歉。这一次,我会更具体,给你们一些直接的例子,准确地描述我想要的。基本上,我需要让原始数据看起来更漂亮: str = '2011-06-1618:53:41222.222.2.22-somedomain.hi.comfw12192.10.215.11GET/965874/index.xls22233665588-0Mozilla/4.0 (compatible; MSI 5.5; Windows NT 5.1)'--55656-0

大家好

我之前发布了类似的内容,所以如果您再次遇到此问题,我向您道歉。这一次,我会更具体,给你们一些直接的例子,准确地描述我想要的。基本上,我需要让原始数据看起来更漂亮:

str = '2011-06-1618:53:41222.222.2.22-somedomain.hi.comfw12192.10.215.11GET/965874/index.xls22233665588-0Mozilla/4.0 (compatible; MSI 5.5; Windows NT 5.1)'--55656-0.55-5874/659874540--'



more strings:
'2011-06-2150:36:1292.249.2.105-somedomain.hi.comfw12192.10.215.11GET/965874/ten.xls22233665588-0Mozilla/4.0 (compatible; MSI 6.0; Windows NT 5.1)'--55656-0.55-5874/659874540--'
'2011-01-1650:23:45123.215.2.215-somedomain.hi.comfw12192.10.215.11GET/123458/five.xls22233665588-0Mozilla/4.0 (compatible; MSI 7.0; Windows NT 5.1)'--55656-0.55-5874/659874540--'
'2011-02-1618:16:54129.25.2.119-thisdomain.hi.comfw12192.10.215.11GET/984745/two.xls22233665588-0Mozilla/4.0 (compatible; MSI 7.0; Windows NT 5.1)'--55656-0.55-5874/659874540--'
'2011-08-0525:22:16164.32.2.111-yourdomain.hi.comfw12192.10.215.11GET/85472/one.xls22233665588-0Mozilla/4.0 (compatible; MSI 8.0; Windows NT 5.1)'--55656-0.55-5874/659874540--'
在调试器中:

import re
str = '2011-06-1618:53:41222.222.2.22-somedomain.hi.comfw12192.10.215.11GET/965874/index.xls22233665588-0Mozilla/4.0 (compatible; MSI 5.5; Windows NT 5.1)'--55656-0.55-5874/659874540--'
domain = re.compile('^.*?(?=([fw].+?))')
domain.search(str).group()
'2011-06-1618:53:41222.222.2.22-somedomain.hi.com'
domain = domain.search(str).group()
所以为了获得域名,我需要去掉破折号(-)之前的所有东西,就在域名之前。我可以用这个RE([0-9]{3,5})。([0-9]{1,3}。){2}[0-9]{1,3}[-]来寻找那个值,但我不知道怎么说,找到那个值并返回它之后的所有内容,但在fw12之前

最后,我希望这些字符串如下所示,使用逗号(,)作为分隔符:


2011-08-05,25:22:16164.32.2.111,yourdomain.hi.com,GET/85472/one.xls,Mozilla/4.0(兼容;MSI 8.0;Windows NT 5.1)

若要分隔每个字段,我建议您使用此模式(然后使用所需的分隔符加入匹配项):


首选但可能不可行的方法

这看起来像(正如MatToufoutu指出的)一个Apache日志文件。如果事实确实如此,那么您可以使用
apachelog
或类似的工具来处理它。您需要使用Apache的httpd.conf/apache2.conf文件字符串作为格式化程序。因为我没有你的,所以我只使用了
apachelog
文档中提供的一个:

import apachelog

format = r'%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" '
log_line = """212.74.15.68 - - [23/Jan/2004:11:36:20 +0000] "GET /images/previous.png HTTP/1.1" 200 2607 "http://peterhi.dyndns.org/bandwidth/index.html" "Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.2) Gecko/20021202" """

p = apachelog.parser(format)
data = p.parse(log_line)
然后,您可以通过访问
数据
的属性来访问日志文件的各个部分

print "%s, %s, %s, %s, %s" % (data['%t'], data['%h'], data['%{Referer}i'], data['%r'], data['%{User-Agent}i'])
获取输出

[23/Jan/2004:11:36:20+0000],212.74.15.68,GET/images/previous.png HTTP/1.1

使用正则表达式

或者,您可以采用初始方法并使用正则表达式来解析该行。以下几点应该行得通。它们被分成命名的组,以便A)阅读B)编辑C)理解:

import re


your_string = "2011-06-1618:53:41222.222.2.22-somedomain.hi.comfw12192.10.215.11GET/965874/index.xls22233665588-0Mozilla/4.0 (compatible; MSI 5.5; Windows NT 5.1)'--55656-0.55-5874/659874540--"

pattern = re.compile(r'(?P<date>\d{4}(:?-\d{2}){2})(?P<time>(:?\d{2}:?){3})(?P<ip_address1>(:?\d{1,3}\.?){4})-(?P<domain>[\w\.]+)fw12(?P<ip_address2>(:?\d{1,3}\.?){4})(?P<get>(:?GET/(:?\d+/)).*?)\d+-0(?P<user_agent>.*?)\'--.*$')
result = pattern.match(your_string)
将返回:

2011-06-16 18:53:41222.222.2.22,somedomain.hi.com,GET/965874/index.xls,Mozilla/4.0(兼容;MSI 5.5;Windows NT 5.1)

由于此方法处理正则表达式,我始终喜欢添加我的小免责声明:

您正在分析数据。这取决于你和你的判断,你需要多少宽容、卫生和验证。您可能需要修改上述内容,以更好地满足您的需求,并正确处理样本中未包含的真实数据。确保您了解正则表达式的作用,以便了解此代码的工作方式


为了解析这个,不管你使用什么技术,你都需要有某种方法来区分域名的尾随部分和它后面的部分。你能用英语表达这是怎么做到的吗?以下文本是否始终为“fw12”,并且域中是否没有该字符串?字段之间没有分隔符的web日志?奇怪的配置:所有IP地址都在特定范围内吗?如果不是,则可能很难构建一个能够知道“fwXX”部分的结尾和IP地址的开头的正则表达式。它看起来非常像您的小时值超过24小时。这有点不寻常。还有54秒。胡说?!
import re


your_string = "2011-06-1618:53:41222.222.2.22-somedomain.hi.comfw12192.10.215.11GET/965874/index.xls22233665588-0Mozilla/4.0 (compatible; MSI 5.5; Windows NT 5.1)'--55656-0.55-5874/659874540--"

pattern = re.compile(r'(?P<date>\d{4}(:?-\d{2}){2})(?P<time>(:?\d{2}:?){3})(?P<ip_address1>(:?\d{1,3}\.?){4})-(?P<domain>[\w\.]+)fw12(?P<ip_address2>(:?\d{1,3}\.?){4})(?P<get>(:?GET/(:?\d+/)).*?)\d+-0(?P<user_agent>.*?)\'--.*$')
result = pattern.match(your_string)
print "%s %s, %s, %s, %s, %s" % (result.group('date'), result.group('time'), result.group('ip_address1'), result.group('domain'), result.group('get'), result.group('user_agent'))