1

我已经为此奋斗了一段时间,并将问题简化为:我试图用“评估”之类的词替换所有“s”字符,但找到的第一个实例除外。IE as5e55ment5. 似乎 re.sub() 在调用函数 retfun() 之前完成了所有匹配。这似乎与 PyDocs 第 7.2 节 re.sub() 下的内容背道而驰。我的问题是:是否有一个我应该使用的不同功能我错过了,或者是我在下面关闭的功能,我只是错过了一些明显的东西。谢谢!(Python 3.3.2)

    import re

    value = "assessments"
    inc = 0

    def retfun(num):
        global inc
        if num == 0:
            inc += 1
            return 's'
        else:
            return '5'

    nval = re.sub(r's', retfun(inc), value, flags=re.IGNORECASE)

    print(nval)
4

2 回答 2

0

retfun()调用你的函数并返回结果。你需要传递你的函数:

nval = re.sub(r's', retfun, value, flags=re.IGNORECASE)

此外,您的替换函数应采用单个参数:

def retfun(match):
于 2013-08-14T04:05:01.737 回答
0

使用类而不是函数。将函数与全局函数一起使用,如果您不清除变量,它将只工作一次inc

import re

class Replace:
    def __init__(self):
        self.count = 0
    def __call__(self, match):
        self.count += 1
        if self.count > 1:
            return '5'
        else:
            return match.group()

value = "assessments"
nval = re.sub(r's', Replace(), value, flags=re.IGNORECASE)
print(nval)
  • 回调函数采用单个匹配对象参数。
  • s不要在回调函数中使用硬编码,而是使用match.group().

替代方案:嵌套函数

import itertools

def Replace():
    count = itertools.count()
    def wrapper(match):
        return '5' if next(count) > 0 else match.group()
    return wrapper
于 2013-08-14T04:07:40.430 回答