0

以下の2つのprintステートメントが異なる結果をもたらす理由を理解できません。誰か説明してもらえますか?小さなサンプル例を示しています。最初のprintステートメントのテーブルは特殊文字に置き換えられており、2番目のテーブルは正しい文字を示しています。

import re  

def tblcnv( str ):  
    rtval = re.sub("table", "chair", str)  
    return rtval  

rval = "<table is in the place where you sit daily "  
tblcnt = re.sub(r"<(table.*place)", tblcnv('\1'), rval)  

print tblcnt  
print tblcnv("<table is in the place where you sit daily")
4

3 に答える 3

2

この行:

tblcnt = re.sub(r"<(table.*place)", tblcnv('\1'), rval)

おそらくあなたが思っていることをしません。を呼び出すと、表示さtblcnv('\1')れるスマイリーフェイスである「\ 1」が返され、文字列の最初のチャンクがスマイリーフェイスに置き換えられます。

于 2013-01-28T16:32:50.373 に答える
2

tblcntを定義するときは、tblcnv('\ 1')を渡します。'\ 1'は、値が0x01の1バイトを含む文字列です。したがって、tblcnvの結果は同じ文字列になります。

于 2013-01-28T16:33:09.860 に答える
1

re.subマニュアルによると、「パターンが重複しないたびに呼び出される」機能を取ります。これらのオカレンスは実際には一致オブジェクトであるため、一致オブジェクトを抽出して関数group(1)に渡す単純なラムダ式を使用するのが最適です。tblcnv

import re

def tblcnv( str ):  
    rtval = re.sub("table", "chair", str)  
    return rtval  

rval = "<table is in the place where you sit daily "  
tblcnt = re.sub(r"<(table.*place)", lambda m: tblcnv(m.group(1)), rval)  

print tblcnt  
print tblcnv("<table is in the place where you sit daily")
于 2013-01-28T16:59:34.553 に答える