【问题标题】:if statement in python regex substitutionpython 正则表达式替换中的 if 语句
【发布时间】:2016-06-23 18:02:58
【问题描述】:

我有一个搜索this 或that 的正则表达式。如果找到this,则将其替换为ONE。如果找到that,则将其替换为TWO。

这是在 Perl 中的样子:

m =~ s/(this)|(that)/ "ONE" x!! $1 . "TWO" x!! $2 /eg

e 是 eval 选项。 . 是一个串联。 x!! 充当 if 语句。

如何在 Python 3 中做同样的事情?我正在寻找类似的东西:

m = re.sub(r"(this)|(that)", ("ONE" * bool(match.group(1))) + ("TWO" * bool(match.group(2))), m, flags=re.EVAL)

我想我有两个主要障碍。首先,我不知道如何在正则表达式替换中获取match 对象within。其次,我不知道python是否支持eval或者最好的选择是什么。

【问题讨论】:

标签: python regex perl python-3.x


【解决方案1】:

Python 没有与正则表达式相关的奇怪语言语法 - 它们是在行为良好的函数调用中执行的。

因此,您所拥有的是一个回调函数,而不是在匹配时执行的部分调用参数:您所要做的就是将一个可调用对象作为第二个参数,而不是替换字符串。可调用对象接收匹配对象作为其唯一参数。

在这种情况下,您只需要一个内联 if - 因此您甚至可以将可调用对象定义为 lambda 表达式:

t = "this this that"
m = re.sub(r"(this)|(that)", lambda x: "ONE" if x.group() == "this" else "TWO", t   )

【讨论】:

  • “Python 没有与正则表达式相关的奇怪语言语法”。不,但是 是否 有与其他事物相关的“奇怪的语言语法”,并且不欢迎你的部落主义
  • 我试图澄清你的答案,但无法确定这一点:“因此,您拥有的不是在匹配时执行的调用参数的一部分,而是一个回调函数:您所要做的就是将可调用对象作为第二个参数,而不是替换字符串。可调用​​对象接收匹配对象作为其唯一参数“。请拆开解释一下
  • “所以你甚至可以将可调用对象定义为 lambda 表达式” 那么这里没有“奇怪的语言语法”!在 Perl 中,lambda 是一个没有名称的子例程,如果 def 更灵活,Python 可能也是如此
猜你喜欢
  • 2020-11-16
  • 1970-01-01
  • 1970-01-01
  • 2011-08-21
  • 2022-10-24
  • 2023-03-14
  • 2019-11-28
  • 2019-12-11
  • 2018-06-21
相关资源
最近更新 更多