3

を使用してプログラムによって行われたすべてのテキスト置換のレポートを作成しようとしていますre.sub。置換されたテキストを変数に取り込む方法がわかりません。これを行うのを手伝ってもらえますか?以下のコードを見つけてください

import re

Report_file = open("report.txt", "w")
st = '''<item><AP>item1</AP><AP>Item2</AP><AP>item3</AP><AP>Item4</AP></item>'''

outval = re.sub(r'(?i)item1', "value1", st)
outval = re.sub(r'(?i)item2', "value2", outval)
outval = re.sub(r'(?i)item3', "value3", outval)  
print outval

次の形式のレポート ファイルが必要です

OLD: item1
NEW: value1

OLD: item2
NEW: value2

OLD: item3
NEW: value3
4

2 に答える 2

4

代わりに、置換パターンの代わりに関数を使用する必要があります。

def build_replacer(replacement):
    def replace(match):
        print match.group(), replacement
        return replacement
    return replace

次に実行します。

outval = re.sub(r'(?i)item1', build_replacer("value1"), st)
outval = re.sub(r'(?i)item2', build_replacer("value2"), outval)
outval = re.sub(r'(?i)item3', build_replacer("value3"), outval)  

元のテキストが印刷され、それが置き換えられます。

これにより、次のようになります。

>>> st = '''<item><AP>item1</AP><AP>Item2</AP><AP>item3</AP><AP>Item4</AP></item>'''
>>> outval = re.sub(r'(?i)item1', build_replacer("value1"), st)
item1 value1
>>> outval = re.sub(r'(?i)item2', build_replacer("value2"), outval)
Item2 value2
>>> outval = re.sub(r'(?i)item3', build_replacer("value3"), outval)  
item3 value3
>>> outval
'<item><AP>value1</AP><AP>value2</AP><AP>value3</AP><AP>Item4</AP></item>'

もちろん、印刷する代わりに、その情報を別の場所に保存することもできます。

このbuild_replacer()関数は新しい関数 を返すだけで、一致するreplace()ものre.sub()が見つかるたびに使用されます。一致したテキストを直接置き換える代わりに、置換テキストとして何を使用するかを関数に尋ねます。

ここでネストされた関数として使用する理由はbuild_replacer()、固定の置換テキストをどこかに保存し、置換テキストをハードコードすることなく、同じ置換関数を何度も再利用できるようにするためです。

于 2013-02-18T14:52:22.480 に答える
1

あなたの質問と回答では、できるだけ多くの指示を書く必要があります

outval = re.sub(r'(?i)item3', .......... )  

交換するアイテムがあるので。

交換するアイテムが 56 個ある場合はどうなりますか?

.

私の次の解決策では、交換する項目が 5 つありますが、手順
r.sub(fruiting,text)は 1 回だけ書かれています。

text = '''
OR 125
BA  48
Pr 12
ba 4
Cherry 147
Ba   10
Or 7
OR 6
Orange 2
AP 9
PR          3
Banana 101
or 22
pR 13
'''

. 再輸入

the_items = ('OR','BA','AP','PR','CH')
new_items = ('Orange','Banana','Apple','Pear','Cherry')
corresp = dict(zip(the_items,new_items))

r = re.compile('(%s) *(\d+)' % '|'.join(the_items),
               re.IGNORECASE)

def fruiting(ma,longname = corresp):
    fresh = '%-12s %s' % (longname[ma.group(1).upper()],
                          ma.group(2) ) 
    tu = ('OLD: %r\n'
          'NEW: %r\n'
          %
          ( ma.group(),fresh) )
    print tu
    return fresh

print '%s%s' % (text, r.sub(fruiting,text))

結果

OLD: 'OR 125'
NEW: 'Orange       125'

OLD: 'BA  48'
NEW: 'Banana       48'

OLD: 'Pr 12'
NEW: 'Pear         12'

OLD: 'ba 4'
NEW: 'Banana       4'

OLD: 'Ba   10'
NEW: 'Banana       10'

OLD: 'Or 7'
NEW: 'Orange       7'

OLD: 'OR 6'
NEW: 'Orange       6'

OLD: 'AP 9'
NEW: 'Apple        9'

OLD: 'PR          3'
NEW: 'Pear         3'

OLD: 'or 22'
NEW: 'Orange       22'

OLD: 'pR 13'
NEW: 'Pear         13'

.

OR 125
BA  48
Pr 12
ba 4
Cherry 147
Ba   10
Or 7
OR 6
Orange 2
AP 9
PR          3
Banana 101
or 22
pR 13

Orange       125
Banana       48
Pear         12
Banana       4
Cherry 147
Banana       10
Orange       7
Orange       6
Orange 2
Apple        9
Pear         3
Banana 101
Orange       22
Pear         13
于 2013-02-18T16:31:19.673 に答える