3

私はこの部分的なXMLを持っています

   string = ''' 
   <x:root>
       <x:tag1 x:anyAttrib="anyValue" x:anyAttrib="anyValue" x:anyAttrib="anyValue" />
       <x:tag2 x:anyAttrib="anyValue" x:anyAttrib="anyValue" x:anyAttrib="anyValue">
          someValue
       </x:tag2>
       <x:tag3> someValue
    '''

今、私はそれを「ばかげて」修理したいと思います。私は、すべての開始要素と終了要素を再登録する方法を考えました->どの要素が欠落しているかを確認し、それを追加するだけです。もちろん、あまり詳細に立ち入ることはありません。私がこれまでに持ってきたものは(そしてこれは機能しません):

import re
starts = re.compile('(?<=<)x:\w+(?=>)|(?<=<)x:\w+(?! .+ />)')
print(start.findall(string))

私が期待しているのは、x:root、x:tag2、x:tag3のリストです。

私はグーグルしてたくさん試してきましたが、答えを見つけることができませんでした。この式から得られるのは、x:root、x:tag1、x:tag3だけです。

助けてください

ありがとう

4

3 に答える 3

1

BeautifulSoupはそれを修復できるかもしれません:

import BeautifulSoup

content = ''' 
<x:root>
   <x:tag1 x:anyAttrib="anyValue" x:anyAttrib="anyValue" x:anyAttrib="anyValue" />
   <x:tag2 x:anyAttrib="anyValue" x:anyAttrib="anyValue" x:anyAttrib="anyValue">
      someValue
   </x:tag2>
   <x:tag3> someValue
'''

soup = BeautifulSoup.BeautifulStoneSoup(content)
print(soup.prettify())

収量

<x:root>
 <x:tag1 x:anyattrib="anyValue" x:anyattrib="anyValue" x:anyattrib="anyValue">
  <x:tag2 x:anyattrib="anyValue" x:anyattrib="anyValue" x:anyattrib="anyValue">
   someValue
  </x:tag2>
  <x:tag3>
   someValue
  </x:tag3>
 </x:tag1>
</x:root>
于 2012-10-25T21:56:48.170 に答える
0

私を助けてくれたalexisに感謝します。

正しい式は次のとおりです。

re.findall(r'<\s*(w:\w+)[^>]*(?<!/)>', string)

この式を使用すると、両方のケースを抽出できます。

最初<tag>

2番目<tag attrib1="value" attrib2="value" attribN="value"/>

残念ながら、XMLを期待どおりに修正しなかったBeautifulsoupなど、いくつかの組み込みのpythonパーサーを使用しようとしましたが運が悪かったです。

良いものを持っている!:)

于 2012-11-24T09:56:30.280 に答える
0

sgmlibデフォルトのpythonに付属しているものを使用します。input1

string1 = '''
   <root xmlns:x='www.test.com'>
       <x:tag1 x:anyAttrib="anyValue" x:anyAttrib="anyValue" x:anyAttrib="anyValue" />
       <x:tag2 x:anyAttrib="anyValue" x:anyAttrib="anyValue" x:anyAttrib="anyValue">
          someValue
       </x:tag2>
       <x:tag3> someValue
    '''

import re
import sgmllib
sgmllib.tagfind = re.compile('[a-zA-Z][-_.:a-zA-Z0-9]*')
starts = re.findall(sgmllib.tagfind, string1)
print starts

output1

['root', 'xmlns:x', 'www.test.com', 'x:tag1', 'x:anyAttrib', 'anyValue', 'x:anyAttrib', 'anyValue', 'x:anyAttrib', 'anyValue', 'x:tag2', 'x:anyAttrib', 'anyValue', 'x:anyAttrib', 'anyValue', 'x:anyAttrib', 'anyValue', 'someValue', 'x:tag2', 'x:tag3', 'someValue']

またはinput2

starts1 = re.finditer(sgmllib.tagfind, string1)
for x in starts1:
    print x.start(), x.end(), x.group(0)

output2:

5 9 root
10 17 xmlns:x
19 31 www.test.com
42 48 x:tag1
49 60 x:anyAttrib
62 70 anyValue
72 83 x:anyAttrib
85 93 anyValue
95 106 x:anyAttrib
108 116 anyValue
129 135 x:tag2
136 147 x:anyAttrib
149 157 anyValue
159 170 x:anyAttrib
172 180 anyValue
182 193 x:anyAttrib
195 203 anyValue
216 225 someValue
235 241 x:tag2
251 257 x:tag3
259 268 someValue

またはelementTree、デフォルトのpythonに付属しているものを使用します。http://docs.python.org/2/library/xml.etree.elementtree.html

于 2012-11-24T10:48:24.860 に答える