2

xml ファイルに正規表現を適用して、値を見つけて置換します。通常は動作します (「xml パーサーを使用してください」という声が聞こえましたが、その間は使用できません)。ただし、値に特殊文字が含まれていると、すべてが台無しになります。

以下のような xml ファイルがあるとします。

<fieldset>
  <idle1>
     <value>something\\n</value>
  </idle1>
  <idle2>
    <value>blabla</value>
  </idle2>
</fieldset>

<idle2><value>" " ノードの値を置き換えようとすると、" " ノードの値<idle1><value>が "something\n" になります。ファイルへの書き込みに関しては、xml は次のようになります。

    <fieldset>
      <idle1>
         <value>something
</value>
      </idle1>
      <idle2>
        <value>blabla</value>
      </idle2>
    </fieldset>

検索と置換の両方で、「r」文字列リテラルを使用します。しかし、うまくいかないようです。問題を解決します。検索と置換のたびに、「\n」を「」に置き換えて\\nから、結果をファイルに書き込みます。しかし、それは効率的な使用方法ではありません。

見えなかったものはありますか?\\nファイルに" " を書き込みたいだけです。これは私がそれを欲しがるほどですか?

編集:これが私の正規表現です:

検索用:

self.searchPattern=(<fieldset>)(.*?)(<idle2>)(.*?)(<value>)(.*?)(</value>)(.*?)(</idle2>)(.*?)(</fieldset>)

置換の場合:

self.replacePattern=`\g<1>\g<2>\g<3>\g<4><value>denemeasdasd\\\\n</value>\g<8>\g<9>\g<10>\g<11>`

これは検索用の python コードです。

self.pattern = re.compile(r''''''+self.searchPattern+'''''', flags = re.S | re.U)

そしてこれは交換用です

outtext = self.pattern.sub(r''''''+self.replacePattern+'''''',r''''''+self.match.group(0)+'''''')
4

2 に答える 2

1

あなたの説明がわかりません。

個人的に、私はこれを書いた:

import re

RE = ('(^([ \t]+)<(idle2)>(?:\n|\r\n?)[ \t]+<value>)'
      '(.*?)'
      '(?=</value>(?:\n|\r\n?)\\2</\\3>)')

print repr(ch),'\n'
print ch
print '\n-------------------------------------------------'
print repr(re.sub(RE,'\\1AAA',ch,flags = re.M)) , '\n'
print re.sub(RE,'\\1-----HHHHHHXXXXXXX-------',ch,flags = re.M)

結果

'<fieldset>\n  <idle1>\n    <value>something\\n</value>\n  </idle1>\n  <idle2>\n    <value>blabla</value>\n  </idle2>\n</fieldset>'

<fieldset>
  <idle1>
    <value>something\n</value>
  </idle1>
  <idle2>
    <value>blabla</value>
  </idle2>
</fieldset>

-------------------------------------------------
'<fieldset>\n  <idle1>\n    <value>something\\n</value>\n  </idle1>\n  <idle2>\n    <value>AAA</value>\n  </idle2>\n</fieldset>'

<fieldset>
  <idle1>
    <value>something\n</value>
  </idle1>
  <idle2>
    <value>-----HHHHHHXXXXXXX-------</value>
  </idle2>
</fieldset>

それはあなたが望むものですか?

于 2011-03-01T10:49:32.210 に答える
0

予測不可能なデータ ソースを扱う場合は、有効な文字をホワイトリストに登録するのが最適です。したがって、実行中の他の正規表現の置換に加えて、ホワイトリストに登録されていないもの、つまり az 0-9 : , を削除します。-

データを見て、タスクに適したホワイトリストを決定してください。

于 2011-03-01T08:33:23.923 に答える