0

我无法弄清楚为什么以下两个打印语句会给出不同的结果。有人可以解释一下吗?我只是举一个小例子。在第一个打印语句表中被一个特殊字符替换,第二个给出了正确的字符。

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 的单个字节的字符串。所以 tblcnv 的结果是相同的字符串。

于 2013-01-28T16:33:09.860 回答
1

根据re.sub手册,它需要一个“为每次不重叠出现的模式调用”的函数。由于这些事件实际上是匹配对象,因此您最好使用一个简单的 lambda 表达式,该表达式提取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 回答