2

不要な文字が含まれる「xml ファイル」ファイルがあります

<data>
  <tag>blar </tag><tagTwo> bo </tagTwo>
  some extra 
  characters not enclosed that I want to remove
  <anothertag>bbb</anothertag>
</data>

次の貪欲ではない置換により、適切に囲まれていない文字が削除されると思いました<sometag></sometag>

re.sub("</([a-zA-Z]+)>.*?<","</\\1><",text)
            ^          ^ ^     ^      text is the xml txt.  
         remember tag, | |     put tag back without and reopen next tag
               read everything until the next '<' (non-gready) 

この正規表現は、で示されている位置のみを見つけるよう[[]]です</tag>[[]]<tagTwo> 何が間違っていますか?

編集: この質問の動機は解決されました(コメントを参照してください。xmlファイルに迷子の & があり、解析されない原因となっていました-削除したい文字とは何の関係もありませんでした)。ただし、正規表現が可能かどうか(および私の試みの何が問題だったのか)についてはまだ興味があるので、質問を削除しません。

4

2 に答える 2

3

re.DOTALLフラグを指定しない限り、ドットは改行と一致しません。

re.sub("</([a-zA-Z]+)>.*?<","</\\1><",text, flags=re.DOTALL)

正常に動作するはずです。(そうでない場合は、正規表現ではなく、私の python に問題があります。修正してください。)

繰り返される文字クラスを定義するときは、できるだけ正確にすることをお勧めします。これは、壊滅的なバックトラッキングを防ぐのに役立ちます。したがって、最後のタグの後に迷子の文字を見つけるという追加のボーナスの[^<]*代わりに使用します。改行と一致するため、これにはフラグ.*?は必要ありません。re.DOTALL[^<]

于 2011-10-06T13:42:08.733 に答える
1
 "</[^>]+?>[^<>]+?<" 

ipythonで:

In [1]: a="<data>  <tag>blar </tag><tagTwo> bo </tagTwo>  some extra   characters not enclosed that I want to remove  <anothertag>bbb</anothertag></data>"

In [2]: import re

In [3]: re.sub( "(</[^>]+?>)[^<>]+?<" ,"\\1<",a)
Out[3]: '<data>  <tag>blar </tag><tagTwo> bo </tagTwo><anothertag>bbb</anothertag></data>'
于 2011-10-06T14:02:33.540 に答える