4

私はこの形式の文字列を持っています

 2013-06-05T11:01:02.955 LASTNAME=Jone FIRSTNAME=Jason PERSONNELID=salalm QID=231412 READER_NAME="CAZ.1 LOBBY LEFT TURNSTYLE OUT" ACCESS_TYPE="Access Granted" EVENT_TIME_UTC=1370480141.000 REGION=UTAH

それらのいくつかはこのように見えます

 2013-06-05T11:15:48.670 LASTNAME=Ga FIRSTNAME="Je " PERSONNELID=jega QID=Q10138202 READER_NAME="CAZ.1 ELEVATOR LOBBY DBL GLASS" ACCESS_TYPE="Access Granted" EVENT_TIME_UTC=1370481333.000 REGION=UTAH

PERSONNELID,REGION,ACCESS_TYPE,EVENT_TIME_UTCの値を抽出したい

split(" ") を使用するつもりでしたが、READER_NAME と ACCESS_TYPE の値にたくさんのスペースが含まれています JSON に変換してキーで検索できますか

これらの文字列を抽出する方法は何ですか。

前もって感謝します

4

3 に答える 3

3

既存のパーサーを探すのは良い考えです。すでにデータを記述している形式、またはデータを自明に変換できる形式を見つけることができれば、あなたの勝ちです。

この場合、JSON への変換は、そもそも解析と同じくらいの作業になるようです。

valueしかし、部分を引用できる単純なコンポーネントとname=valueコンポーネントに分割しようとしているだけですvalue...これらは、最小限のシェル構文と同じルールです。だから、shlexあなたのためにそれをします:

>>> import shlex
>>> shlex.split('2013-06-05T11:01:02.955 LASTNAME=Jone FIRSTNAME=Jason PERSONNELID=salalm QID=231412 READER_NAME="CAZ.1 LOBBY LEFT TURNSTYLE OUT" ACCESS_TYPE="Access Granted" EVENT_TIME_UTC=1370480141.000 REGION=UTAH')
['2013-06-05T11:01:02.955',
 'LASTNAME=Jone',
 'FIRSTNAME=Jason',
 'PERSONNELID=salalm',
 'QID=231412',
 'READER_NAME=CAZ.1 LOBBY LEFT TURNSTYLE OUT',
 'ACCESS_TYPE=Access Granted',
 'EVENT_TIME_UTC=1370480141.000',
 'REGION=UTAH']

name=value各ペアを名前と値のコンポーネントに分離する必要がありますが、それはnamevalue.split('=', 1). ただし、名前と値のペアではない要素がいくつかあることを考えると、それを個別に行う必要があることはほとんど暗黙のうちに示されています ( 2013-06-05T11:01:02.955)。

もちろん、それらを空の値を持つ名前と値のペアとして扱うことをいつでも選択できます。

>>> dict(namevalue.partition('=')[::2] for namevalue in shlex.split(s))
{'2013-06-05T11:01:02.955': '',
 'ACCESS_TYPE': 'Access Granted',
 'EVENT_TIME_UTC': '1370480141.000',
 'FIRSTNAME': 'Jason',
 'LASTNAME': 'Jone',
 'PERSONNELID': 'salalm',
 'QID': '231412',
 'READER_NAME': 'CAZ.1 LOBBY LEFT TURNSTYLE OUT',
 'REGION': 'UTAH'}
于 2013-06-05T18:28:11.897 に答える
3

問題を分析してみましょう: 4 つの識別子の 1 つ、次に=記号、引用符で囲まれた文字列または空白以外の文字列のいずれかと一致させたいとします。

これは、正規表現の完璧な仕事です。

>>> s= ' 2013-06-05T11:01:02.955 LASTNAME=Jone FIRSTNAME=Jason PERSONNELID=salal
m QID=231412 READER_NAME="CAZ.1 LOBBY LEFT TURNSTYLE OUT" ACCESS_TYPE="Access Gr
anted" EVENT_TIME_UTC=1370480141.000 REGION=UTAH'
>>> import re
>>> regex = re.compile(r"""\b(PERSONNELID|REGION|ACCESS_TYPE|EVENT_TIME_UTC)
...                        =
...                        ("[^"]*"|\S+)""", re.VERBOSE)
>>> result = regex.findall(s)
>>> result
[('PERSONNELID', 'salalm'), ('ACCESS_TYPE', '"Access Granted"'), 
 ('EVENT_TIME_UTC', '1370480141.000'), ('REGION', 'UTAH')]
>>> dict(result)
{'EVENT_TIME_UTC': '1370480141.000', 'PERSONNELID': 'salalm', 
 'ACCESS_TYPE': '"Access Granted"', 'REGION': 'UTAH'}

説明:

\b一致が単語境界で始まることを確認します。

"[^"]*"引用符の後に任意の数の引用符以外の文字が続き、別の引用符に一致します。

\S+1 つ以上の非空白文字に一致します。

正規表現の「興味深い」部分を括弧で囲み、キャプチャ グループを構築することにより、一致の各部分のタプルのリストを個別に取得します。

于 2013-06-05T18:22:26.877 に答える