首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python:使用def定义用于re.sub的匿名函数

Python:使用def定义用于re.sub的匿名函数
EN

Stack Overflow用户
提问于 2022-05-07 21:40:12
回答 3查看 76关注 0票数 1

我还没有找到一个答案,这是否合法。它是一个在字符串中查找和替换所有“变量”(以v_开头的单词)的函数。由于"if“子句的必要性,我不能使用lambda,因为替换函数需要多个行。

代码语言:javascript
复制
def fillin(template, dictionary):
    result = re.sub(r'v_([a-z_]+)', def(match):
        variable = match.group(1)
        if not variable in dictionary:
            return match # don't replace nuthin'                                                   
        return dictionary[variable],
        Scene )
    return result

它获取本文中以v_开头的所有字符串,然后查看字符串的其余部分以获得“变量名”,在字典中查找变量名,并将字符串替换为查找的值。

我不能使用lambda,因为在其中我需要一个"if key字典“子句来防止字典中的查找错误。

是否没有方法将def用于匿名函数?

EN

回答 3

Stack Overflow用户

发布于 2022-05-07 21:46:57

我想这个lambda会对你有用的。

代码语言:javascript
复制
lambda match: match if not match.group(1) in dictionary else dictionary[match.group(1)]
票数 0
EN

Stack Overflow用户

发布于 2022-05-07 21:58:04

您可以使用lambda,如果使用dictionary.get(x.group(1), x.group()),仍然可以保持它的简短性。

代码语言:javascript
复制
re.sub(r'v_([a-z_]+)', lambda x: dictionary.get(x.group(1),x.group()), text)

Python演示

代码语言:javascript
复制
import re
text = "aaa v_abc v_def"
dictionary = { 'abc':'yes' }
print( re.sub(r'v_([a-z_]+)', lambda x: dictionary.get(x.group(1),x.group()), text) )
# => aaa yes v_def
票数 0
EN

Stack Overflow用户

发布于 2022-05-07 21:59:31

在调用“re.sub”之前定义函数,并将函数作为正常参数传递。"def“声明为函数提供了一个名称--它引用函数的方式与内嵌"lambda”表达式所做的一样。

代码语言:javascript
复制
def replacer(match):
   variable = match.group(1)
   if not variable in g_dictionary:
       return match # don't replace nuthin'                                                   
   return dictionary[variable]

def fillin(template, dictionary):
    global g_dictionary
    g_dictionary
    result = re.sub(r'v_([a-z_]+)', replacer, Scene)
    return result

上面的示例将字典重新分配到一个全局变量,以便可以在其他函数中看到它。更常见的方法是定义嵌套函数,如下面的示例所示。

在这种情况下,您需要访问“字典”(它是外部作用域中的一个变量),您可以定义嵌套在replacer中的fillin --这正是定义lambda函数时发生的情况。:

代码语言:javascript
复制
def fillin(template, dictionary):

   def replacer(match):
       variable = match.group(1)
       if not variable in dictionary:
           return match # don't replace nuthin'                                                   
       return dictionary[variable]

    result = re.sub(r'v_([a-z_]+)', replacer, Scene)
    return result
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72156540

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档