Python 反转regexp替换
给定一个表示为regexp替换的字符串转换,是否有一种方便的方法来反转该转换(最好是在python中) 例如,给定转换Python 反转regexp替换,python,regex,Python,Regex,给定一个表示为regexp替换的字符串转换,是否有一种方便的方法来反转该转换(最好是在python中) 例如,给定转换 def f(x): return re.sub('foo((:?bar)?)', r'\1', x) 它将'foobar'转换为'bar',并将'foo'转换为空字符串,我想获得 def g(x): return re.sub('((:?bar)?)', r'foo\1', x) 从这个意义上说,反过来说 f(g(x)) == x 显然,并不是所有的regexp替换都是1
def f(x): return re.sub('foo((:?bar)?)', r'\1', x)
它将'foobar'
转换为'bar'
,并将'foo'
转换为空字符串,我想获得
def g(x): return re.sub('((:?bar)?)', r'foo\1', x)
从这个意义上说,反过来说
f(g(x)) == x
显然,并不是所有的regexp替换都是1:1映射,但我的一厢情愿是,它们都可以在获得一个可能的输入值g(x)
的意义上反转,该值将从原始替换中产生给定的输出x
我为什么要这么做?我想基于解析Apache配置文件中的
AliasMatch
指令为任意文件系统路径生成URL。实际上,本例中发生的是:
xy? -> $1
y? -> x$1
我不完全确定你想要的是什么——更多的例子不会有什么坏处——但我认为,一般公式可以扩展到涵盖更多的,至少是简单的情况。你的例子不起作用<代码>('foo(bar)','foo$1')不是
('foo(bar)','foo$1')
的反面
如果您尝试(暂时放弃组替换):
您将获得fooxfooyfoozfoo
这是因为(bar)?
匹配空字符串,并且空字符串存在于字符串中的每个可能位置
我建议,在这样一个简单的例子中,对于这样的问题,您可能想要寻求一种不同的方法来处理您实际试图做的事情
(我删除了上面的组,因为它在Python中实际上不起作用。如果您执行
re.sub(r'(bar)?',r'foo\1',xyz')
,如果跳过(bar)?
,它将失败,并出现异常。您可以使用((bar)?)
,这样外部分组就不会被忽略。不过,这是您的问题的附带问题。)+1这是一个非常有趣的问题,但我怀疑是否有一个可以理解的解决方案,甚至是一个非常可靠的解决方案。谢谢你的提示。我已经按照你的建议改正了这个例子。现在,将'fooxfooyfoozfoo'
传递到原始替换中会返回'xyz'
。因此,我认为'fooxfooyfoozfoo'
是一个可以接受的结果……是的,这也是我的感觉。。。我的问题是,一小部分类似的简单规则是否实际上涵盖了所有可能的regexp,是否有一种方法可以应用这些规则,而不需要我编写自己的regexp解析器。
import re
re.sub(r'(bar)?', 'foo', 'xyz')