3

長い文字列内にある数字 (コーナー) を置き換える必要があります。これらはすべて次のようになります。

[ 17 plane_17 \ 23 25 17 99 150 248 \ noname ]

私の関数は、「古い」数値を「新しい」数値に置き換える必要があります。たとえば、その古い数値が 17 で新しい数値が 19 の場合、結果は次のようになります。

[ 17 plane_17 \ 23 25 19 99 150 248 \ noname ]

\ \ 内の数字のみを置き換える必要があることに注意してください (これらは / / の場合もあります)。

これを行うために、\ \ または / / の外側の数字を避けることを意図して、正規表現置換を設定しようとしました。 newplane = re.compile(r"[^[_] (" + str(oldcorner) + ")").sub(str(newcorner), oldplane)

正規表現は行の先頭から検索し、パターンと一致しない場合は失敗するため、これは機能しないことにすぐに気付きました。

私が知らない賢い方法がまだあるはずです..何か提案はありますか?

4

2 に答える 2

4

正規表現のサブ部分内でコールバック関数を使用できます。

import re

def callback(match):
    return match.group(0).replace('17', '19')

s = "[ 17 plane_17 \ 23 25 17 99 150 248 \ noname ]"

s = re.compile(r'\\.+?\\').sub(callback, s)

print s

版画:

[ 17 plane_17 \ 23 25 19 99 150 248 \ noname ]
于 2013-03-11T14:30:19.837 に答える
1

vpekar の回答に加えて、置換文字列でパターンの後方参照を使用することもできるため、新しい番号と後方参照を使用して文字列をすべて一致させる/か、再作成することができます。\

line = '[ 17 plane_17 \ 23 25 17 99 150 248 \ noname ]'
re.sub(r'([\\|/].*\s)(?:17)(\s.*[\\|/])', r'\g<1>19\2', line)

戻り値:

'[ 17 plane_17 \ 23 25 19 99 150 248 \ noname ]'
于 2013-03-11T14:36:26.553 に答える