0

次のようなXMLスニペットがあります。

<CharacterBlock MinVal="-10.000000"  MaxVal="15.000000" Active="1">

そして、最小および最大の浮動小数点値を解析する必要があります。ElementTreeのようなXMLパーサーを使用できないため、正規表現を使用する必要があります。

私は次のPython正規表現を作成しました。

re.compile('<CharacterBlock MinVal="(?P<MinVal>-?[0-9]*\.?[0-9]*)" MaxVal="(?P<MaxVal>-?[0-9]*\.?[0-9]*)" .*?>', re.DOTALL)

これは上記のスニペットで機能します。ただし、XML属性は辞書のようなものであるため、その順序は保証されておらず、次のようなスニペットを受け取ることがあります。

<CharacterBlock Active="0" MaxVal="-15.000000" MinVal="-100.000000">

一致させたいグループの順序が固定されていない場合、どうすればよいですか?

4

3 に答える 3

1

2つの値を別々に取得できますか?お気に入り:

In [2]: s='<CharacterBlock Active="0" MaxVal="-15.000000" MinVal="-100.000000">'
In [3]: import re
In [4]: manReg='(?<=MaxVal=")[^"]*'
In [5]: minReg='(?<=MinVal=")[^"]*'

In [6]: re.findall(minReg, s)
Out[7]: ['-100.000000']

In [8]: re.findall(maxReg, s)
Out[9]: ['-15.000000']
于 2012-10-15T15:24:37.237 に答える
1

順序は固定されておらず、他のフィールドもあるため、MaxVal用とMinVal用の2つの正規表現を使用するのが最善の策のようです。

于 2012-10-15T15:25:43.083 に答える
0

何かのようなもの:

for xmltag in re.finditer(r'<CharacterBlock.*?>', s):
    ismin = re.search(r'\bMinVal=["\'](.*?)[\'"]', xmltag.group(0))
    if ismin:
        min=ismin.group(1)
    ismax= re.search(r'\bMaxVal=["\'](.*?)[\'"]', xmltag.group(0))
    if ismax:
        max=ismax.group(1)
    if ismin and ismax:
        print "Min: %s,  Max %s" % (min, max)
于 2012-10-15T19:31:53.690 に答える