如何在Python中用正则表达式中的函数替换匹配项

Muxevola

我试图更好地了解lambda函数和正则表达式匹配如何在Python中工作。为此,我将lambda替换为命名函数。

即使我找到了使它起作用的方法,但我仍然无法理解它为什么起作用。

我正在处理的lambda / regex是以下帖子中提到的:

如何替换一个字符串的多个子字符串?

Python-将正则表达式匹配替换为匹配对值

这是主要的代码段:

import re

# define desired replacements here
rep = {"condition1": "", "condition2": "text"}
text = "(condition1) and --condition2--"

# use these three lines to do the replacement
rep = dict((re.escape(k), v) for k, v in rep.items())
pattern = re.compile("|".join(rep.keys()))
output = pattern.sub(lambda m: rep[re.escape(m.group(0))], text)

print(output)
>>> '() and --text--'

如果我将lambda函数替换为:

def replace_conditions(match, rep):
    return rep[re.escape(match.group(0))]

output = pattern.sub(replace_conditions(m, rep), text)

我得到以下异常:

NameError: name 'm' is not defined

而且我能够使用以下语法使其工作:

def replace_conditions(match, rep=rep):
    return rep[re.escape(match.group(0))]

output = pattern.sub(replace_conditions, line)

注意:我必须为第二个参数“ rep”预先分配一个值,并使用函数的名称,而无需实际调用它。

我不明白为什么不使用正则表达式将正则表达式表达式返回的匹配正确传递给函数,而使用常规语法调用时不将其传递给第一个参数。

mb21

我不明白为什么如果不带参数调用正则表达式表达式返回的匹配项正确传递给函数

那不是正在发生的事情。pattern.sub(replace_conditions, line)不调用该replace_conditions函数,它只是将其传递。

文档中获取:

re.sub(pattern, repl, string, count=0, flags=0)

与以下内容相同:

pattern.sub(repl, string)

如果repl是函数,则在每次非重叠发生模式时都会调用它。该函数采用单个match对象参数,并返回替换字符串。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在Python中用正则表达式匹配和替换多个字符串

正则表达式子方法不会替换python正则表达式中的所有匹配项

如何在python中匹配正则表达式?

如何使用搜索/替换在Vim中访问正则表达式匹配项?

Objective-C中的正则表达式:如何用动态模板替换匹配项?

如何捕获全局正则表达式替换中的每个匹配项?

Python-在字节文件中替换正则表达式匹配项

Python正则表达式:替换匹配项中的单个字符

正则表达式替换无法在Python中用正则表达式变量替换

正则表达式将匹配项中的所有匹配项替换x次

如何在 Python 中使用正则表达式提取指定的匹配项?

如何在Python中找到与正则表达式的所有匹配项?

如何在python中获得正则表达式的第一个匹配项

如何在正则表达式中创建匹配项?

如何在PHP中获取所有正则表达式匹配项?

van如何在正则表达式中获得2个匹配项?

如何在Rascal中建立多个正则表达式匹配项的列表?

如何在Java中用正则表达式来替换性地替换字符串

如何在 AWK 中替换正则表达式?

正则表达式替换为匹配项

在 Python 中用正则表达式替换 '(' 时出错

在 Python 中用正则表达式替换多个项目

如何在Javascript中匹配正则表达式

如何在Smalltalk正则表达式中匹配[

如何在正则表达式中匹配“ [”和“]”?

如何在正则表达式中匹配“或”内部?

如何在scala中的foreach函数中的正则表达式上进行模式匹配?

如何在Julia中评估用正则表达式替换的函数?

如何在不使用单独的替换函数的情况下遍历正则表达式匹配并进行替换?