0


0

mystring = '14 | "プリプロセッサフ​​レーム数が増加していません;カード:マザーボード、ポート:2" | minor '

だから私はパイプ( "|")で区切られた3つの要素(ID、メッセージとレベル)があります。 各要素を取得したいので、これらの小さな関数を書きました。

def get_msg(i):x = i.split( "|")はx [1] .strip()を返します。replace( '"'、 '')

def get_level(i):x = i.split( "|")return x [2] .strip()#testing print get_msg(mystring)#欠けている入力PID、PID:20:静的コンポーネントのポート4 print get_level( mystring)#メジャー

現時点ではうまく機能していますが、これを解決するための解決策ではないと思います。2つの機能をどのように改善できるでしょうか。 正規表現はここにフィットしているように感じますが、私はそれが非常に素朴であるので適用できませんでした。

5 Answer


5


私は最もpythonicな方法はcsvモジュールを使うことだと思います。 区切り記号オプション付きの PyMotWから:

import csvインポートシステム

f = open(sys.argv [1]、 'rt')試してみてください:reader = rowのためのreader = csv.reader(f、delimiter = '|'):最後にprint row:f.close()


2


lst = msg.split( '|')level = lst [2] .strip()message = lst [1] .strip( '"')

あなたは文字列を2回分割していますが、それはちょっとした無駄ですが、それ以外の変更は軽微です。


1


ベストプラクティスは、実際にはより良いフォーマットの文字列を使用すること、またはそのために文字列を使用しないことです。 なぜそれは文字列ですか? どこからこれをパースしていますか? データベース? XML? 原点は変更できますか?

{'id':14、 'メッセージ': 'foo'、 'タイプ': 'マイナー'}

このようなデータ型がベストプラクティスだと思います。それがデータベースに格納されている場合は、複数の列に分割します。

編集:多すぎる/効率が悪くなる可能性があるため、おそらくこれで駄目になるでしょうが、後で多くのセクションを追加する場合は、これらを素敵なハッシュマップに格納することができます。

>>> formatParts = {
...     'id': lambda x: x[0],
...     'message': lambda x: x[1].strip(' "'),
...     'level': lambda x: x[2].strip()
... }
>>> myList = mystring.split( '|')>>> formatParts ['id'](myList) '14' >>> formatParts ['message'](myList) 'プリプロセッサフ​​レーム数は増えません。カード:マザーボード、ポート番号:2 '>>> format部品(' level '](myList)' minor '


1


クラスMyParser(オブジェクト):def __init __(自己、値):self.lst = value.split( '|') 2] .strip()defメッセージ(自己):self.lst [1] .strip( '"')を返す


0


getter関数が必要ないなら、これはうまく機能するはずです。

>>> m_id、msg、lvl = [mystring.split( '|')]内のsの[s.strip( '"')] >>> m_id、msg、lvl( '14'、 'プリプロセッサフ​​レーム数は増加しません。カード:マザーボード、ポート:2 '、'マイナー ')

注:組み込み関数 'id’をシャドウイングしないでください