2

皆さん、良い一日を

以前も似たようなことを書いたので、また同じようなことがあったらごめんなさい。今回はより具体的に、直接的な例を示し、私が望むものを正確に描写します。基本的に、生データをよりきれいに見せる必要があります。

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)

4

2 に答える 2

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)

このメソッドは正規表現を扱うので、私はいつもちょっとした免責事項を追加したいと思っています:

データを解析しています。どの程度の寛容、衛生、および検証が必要かは、あなたとあなたの判断に委ねられています。要件に合わせて上記を変更し、サンプルに含まれていない実際のデータを適切に処理する必要がある場合があります。このコードがどのように機能するかを理解できるように、正規表現が何を行っているかを理解してください。

于 2013-06-26T21:34:40.413 に答える
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]+([^'-]+)
于 2013-06-26T20:34:14.427 に答える