0

pywikibotを使用してインターウィキ翻訳リンクを自動修正するための小さなスクリプトを作成しています。既存のリンクを探して、すべてのページへのリンクを含む標準形式でそれらを書き直したいと考えています。

私が探しているテキストは、どちらかのように見えます

{{Trad|EN=Under Spring|FR=Sources Interdites|DE=Verbotene Quellen}}

または複数行のように

{{Trad
|DE=Urwurzeln
|EN=Prime Roots
|ES=Raíces Primarias
|FR=Primes Racines
|RU =Изначальных Корней
|H  = 
|palette=primes
}}

wikiページのソースでこれら2つのインスタンスを見つけることができました

reg_strg = '{{trad([\w\s\|\=]*)}}'
rex = re.search(reg_strg, text, re.IGNORECASE | re.MULTILINE)

これにより、次のようなテンプレートの中心が得られます(最初のケースの場合)

|EN=Under Spring|FR=Sources Interdites|DE=Verbotene Quellen

同様に、2番目の複数行文字列と同様です。

ただし、replace コマンドで同じ reg_strg を使用するようになりました。置換に失敗し、テキストは変更されずに残り、new_strg は、置換文字列を構成するために読み取られたものから作成されます。ただし、結果は、new_strg が複数行の文字列であるか、単純な「flobberigoo」であるかに依存しません。

text = re.sub(reg_strg, new_strg, text, re.IGNORECASE | re.MULTILINE)

したがって、明らかに re.search と re.sub の間にはいくつかの違いがあります-しかし、ドキュメントでそれを見つけることができませんでした(re.search と re.match の違いを認識していても、そのように理解しました。 sub は最初のように動作する必要があります)。

何が恋しいですか?ページで見つけた前述の正規表現を文字列に置き換えるにはどうすればよいですか?

完全を期すために、これはデバッグ出力を含む完全な関数です:

def replace_translation_template(self, text, translations):
    """
    @param text The page text to look through
    @param translations dictionary of translations
    """
    reg_strg = '{{trad([\w\s\|\=]*)}}'
    rex = re.search(reg_strg, text, re.IGNORECASE | re.MULTILINE)

    print("Replacing:")
    try:
        print(rex.group(1))
        strgs = rex.group(1).split('|')
        print(strgs)
        new_strg = ""
        for lang,pagename in translations.items():
            if pagename is None:
                pagename = ""
            new_strg += '|' + lang.upper() + '=' + pagename + '\n'

        #print("New_strg: ", new_strg)

        for lang in translations.keys():
            for (n,str) in enumerate(strgs):
                if lang.upper() in str:
                    strgs.pop(n)

        for s in strgs:
            if len(s) > 2:
                new_strg += '|' + s + '\n'
        print(new_strg, '\n')
        print('\n with \n \n')
        text = re.sub(reg_strg, new_strg, text, re.IGNORECASE | re.MULTILINE)
        print(text)

    except:
        print("no text matched:", rex)
4

0 に答える 0