美好的一天,
我之前发布了类似的内容,所以如果再次遇到这种情况,我会道歉。这一次我将更具体,并给你直接的例子,并准确描绘我想要的。基本上,我需要使原始数据看起来更漂亮:
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:16,164.32.2.111,yourdomain.hi.com,GET / 85472 / one.xls,Mozilla / 4.0(兼容; MSI 8.0; Windows NT 5.1)
答案 0 :(得分:2)
首选但可能不可能的方法
这看起来像(如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)
然后,您可以访问data
的属性
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,http://peterhi.dyndns.org/bandwidth/index.html,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)
然后,您可以使用result.group('groupname')
访问结果,例如:
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'))
将返回:
2011-06-16 18:53:41,222.222.2.22,somedomain.hi.com,GET / 965874 / index.xls,Mozilla / 4.0(兼容; MSI 5.5; Windows NT 5.1)
由于此方法处理正则表达式,我总是想添加我的小免责声明:
您正在解析数据。它取决于您和您对需要多少耐受性,卫生和验证的判断。您可能需要修改上述内容以更好地满足您的要求,并使用未包含在样本中的真实数据。确保您了解正则表达式正在执行的操作,以便您了解此代码的工作方式。
答案 1 :(得分:0)
要分隔每个字段,我建议你使用这个模式(然后你用你想要的分隔符加入匹配):
(\d{4}-\d{2}-\d{2})(\d{2}:\d{2}:\d{2})(\d+(?:\.\d+){3})-([a-z.]+)fw\d+(?:\.\d+){3}(GET\/\d+\/[a-z.]+)[-\d]+([^'-]+)