Python で正規表現を使用して複数のキーと値の行を分割しようとしています。私が作業しているファイルには 120 万行を超える行があるため、気にする必要があるすべての異なるキー値の出現に適した数行の別のファイルを作成しました。
@=""
@="0"
@="="
@="@"
@="k=\"v\""
@=dword:00000000
@=hex:00
"k"=""
"k"="="
"k"="@"
"k"="k=\"v\""
"k"="v"
"k"=dword:00000000
"k"=hex:00
"k=\"v\""=""
"k=\"v\""="="
"k=\"v\""="@"
"k=\"v\""="k=\"v\""
"k=\"v\""="v"
"k=\"v\""=dword:00000000
"k=\"v\""=hex:00
私はすでに魅力のように機能するかなり単純な後読み/先読み正規表現で仕事をしています:
#!/usr/bin/env python
import re
regex = re.compile(r'(?<=@|")=(?=[dh"])')
for line in open('split-test'):
line = line.strip()
key, value = regex.split(line, 1)
if key != '@':
key = key[1:-1]
print '{} => {}'.format(key, value)
出力:
@ => ""
@ => "0"
@ => "="
@ => "@"
@ => "k=\"v\""
@ => dword:00000000
@ => hex:00
k => ""
k => "="
k => "@"
k => "k=\"v\""
k => "v"
k => dword:00000000
k => hex:00
k=\"v\" => ""
k=\"v\" => "="
k=\"v\" => "@"
k=\"v\" => "k=\"v\""
k=\"v\" => "v"
k=\"v\" => dword:00000000
k=\"v\" => hex:00
ご覧のとおり、コード フローでは、キー部分から先頭と末尾の引用符を削除する必要があります。とはいえ、何も最適化しようとしているわけではなく、正規表現自体で同じ結果を達成する方法を学ぼうとしているだけです。
上記の元のコードで多くの変更を試みましたが、次のコードを使用して、恐ろしく遅いが機能する新しい正規表現を正常に取得しました。
#!/usr/bin/env python
import re
regex = re.compile(r'(?:(@)|(?:"((?:(?:[^"\\]+)|\\.)*)"))=')
for line in open('split-test'):
line = line.strip()
key, value = filter(None, regex.split(line))
print '{} => {}'.format(key, value)
ここでは、filter()
いくつかの空の文字列に一致するため、使用する必要があります。私は正規表現のマスターではないので、この仕事をするより良い正規表現が書かれていないかと思っています。