0

次のような文字列があります。

myString = "major: 11, minor: 31, name: A=1,B=1,C=1,P=1, severity: 0, comment: this is down"

私はこれまでこれを試しました:

dict(elem.split(':') for elem in myString.split(','))

上記のname-elementをキャッチするまでは、正常に機能split()':'ます。新しい辞書として使用したい形式の要素。

myDic = {'major':'11', 'minor': '31', 'name':{'A':'1', 'B':'1', 'C':'1', 'P', '1'}, 'severity': '0', 'comment': 'this is down'}

可能であれば、複雑な解析は維持するのが難しいことが判明したため、避けたいと思います。 また、上記の文字列のキーまたは値の名前/量もわかりません。私はフォーマットを知っています。これはJSON応答ではなく、ファイル内のテキストの一部であり、現在の形式を制御することはできません。

4

3 に答える 3

1

参考までに、これは完全なソリューションではありません。

これが入力の具体的な構造であり、ソース内の一定のパターンになる場合は、コンマで区切られたトークンを区別できます。

との違いはmajor: 11、最初のトークンの後にスペースname: A=1,B=1,C=1,P=1,があり、2番目のトークンとの違いを生むことです。したがって、2番目のメソッドにスペースを追加するだけで、文字列を適切にレンダリングできます。split

したがって、コードは次のようになります。

dict(elem.split(':') for elem in myString.split(', '))   

分割方式の送信に注意してください。スペースとカンマがあります...

JSON形式に関しては、もっと作業が必要だと思います。今はわかりません..

于 2013-01-21T15:03:15.663 に答える
0

ここに別の提案があります。

辞書表記に変換してみませんか。

たとえば、最初のステップでは、「:」と「=」を含む(コンマまたは入力の終わり)の間のすべてを置き換えます(空白はありません、わかりません)。中かっこで囲み、「=」を置き換えます。に ':'。

2番目のステップでは、「:」と(コンマまたは入力の終わり)の間のすべてを「」でラップし、末尾と先頭の空白を削除します。

最後に、すべてを中かっこで囲みます。

私はまだその構文を信頼していませんが...おそらく数千行が正常に処理された後...

于 2013-01-21T15:33:20.570 に答える
0

少なくとも、これは与えられた例を正しく解析します...

import re

def parse(s):

    rx = r"""(?x)
        (\w+) \s* : \s*
        (
            (?: \w+ = \w+,)*
            (?: \w+ = \w+)
            |
            (?: [^,]+)
        )
    """

    r = {}
    for key, val in re.findall(rx, s):
        if '=' in val:
            val = dict(x.split('=') for x in val.split(','))
        r[key] = val
    return r


myString = "major: 11, minor: 31, name: A=1,B=1,C=1,P=1, severity: 0, comment: this is down"
print parse(myString)    
# {'comment': 'this is down', 'major': '11', 'name': {'A': '1', 'P': '1', 'C': '1', 'B': '1'}, 'minor': '31', 'severity': '0'}
于 2013-01-21T16:07:08.497 に答える