0

次の形式のテキストがあります。

        <cast_member billing="top">
            <display_name>Elijah Wood</display_name>
            <character_name>#9 (voice)</character_name>
            <locales>
                <locale name="ko-KR">
                    <display_name>일라이자 우드</display_name>
                </locale>
                <locale name="cmn-Hant">
                    <display_name>伊利亞伍德&lt;/display_name>
                </locale>
            </locales>
        </cast_member>
        <cast_member billing="top">
            <display_name>Peter Pan</display_name>
            <character_name>#8 (voice)</character_name>
        </cast_member>

<locales>タグが存在する場合、タグ内およびタグを含むすべてを削除するにはどうすればよいですか。上記の入力は次のようになります。

        <cast_member billing="top">
            <display_name>Elijah Wood</display_name>
            <character_name>#9 (voice)</character_name>
        </cast_member>
        <cast_member billing="top">
            <display_name>Peter Pan</display_name>
            <character_name>#8 (voice)</character_name>
        </cast_member>
4

4 に答える 4

1

これは正規表現なしの純粋なPythonで機能しますが、インデントを破壊したり、テキストが切り取られた場所に空白行を残したりする可能性があります

<cast_member billing="top">
    <display_name>Elijah Wood</display_name>
    <character_name>#9 (voice)</character_name>

</cast_member>
<cast_member billing="top">
    <display_name>Peter Pan</display_name>
    <character_name>#8 (voice)</character_name>
</cast_member>

コードは次のとおりです。

with open('data') as f:
    text = f.read()

oTag = "<locales>"
cTag = "</locales>"

newText = ''
p = 0
s = text.find(oTag, p)
while s > -1:
    e = text.find(cTag, s)
    if e == -1:
        # ERROR: no closing tag
        pass
    newText += text[p:s]
    p = e + len(cTag)
    s = text.find(oTag, p)
newText += text[p:]

print newText,
于 2012-08-10T22:00:52.227 に答える
1

HTMLまたはXMLの解析に正規表現を使用しないでください。代わりに、優れたlxmlライブラリを使用してください。

于 2012-08-10T20:48:47.020 に答える
0

正規表現と正規表現置換関数を使用できます

"string" .replace(/ s /、'')-> "tring"

次のような正規表現を作成できます。/(\s+.+){0,}</locales>/->これは、ロケールの開始タグと終了タグ、およびその間のすべてに一致します。

http://rubular.com/r/WTfo0b2bet動作を確認する

myXMLstring.replace(/(\ s +。+){0、} </ locales> /、'')

于 2012-08-10T20:46:51.520 に答える
0

lxmlを使用して、私がやったことは次のとおりです。

cast_name = node.xpath("//package/video/cast/cast_member/display_name")
character_name = node.xpath("//package/video/cast/cast_member/character_name")
combined_cast = zip(cast_name, character_name)
cast = [(item1.text, item2.text) for item1, item2 in combined_cast]

[(Elijah Wood,#9 (voice)), (Peter Pan, #8 (voice))]
于 2012-08-10T20:56:25.677 に答える