反转正则表达式替换

时间:2011-01-13 21:28:50

标签: python regex

给定表示为正则表达式替换的字符串转换,是否有一种方便的方法来反转该转换,最好是在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:1映射,但我的一厢情愿是,在获得一个可能产生给定输出g(x)的可能输入值x的意义上,它们都可以被颠倒过来。从最初的替代。

为什么我要这样做?我想基于解析Apache配置文件中的AliasMatch指令为任意文件系统路径生成URL。

2 个答案:

答案 0 :(得分:2)

你的例子不起作用; ('(bar)?', 'foo$1')('foo(bar)?', '$1')不相反。

如果您尝试(暂时删除组替换):

import re
re.sub(r'(bar)?', 'foo', 'xyz')

你得到fooxfooyfoozfoo

那是因为(bar)?匹配空字符串,并且字符串中每个可能的位置都存在空字符串。

我建议在这样一个简单的例子中遇到这样的问题,你可能想要寻求一种不同的方法来实现你真正想做的事情。

(我删除了上面的组,因为它实际上不适用于Python。如果你re.sub(r'(bar)?', r'foo\1', 'xyz'),如果跳过(bar)?,它将失败并出现异常。你可以用{修复此问题{1}},因此永远不会省略外部分组。但这是您的问题的偶然因素。)

答案 1 :(得分:0)

嗯,实际上这个例子中发生的是:

xy? -> $1
y?  -> x$1

我不完全确定你所追求的是什么 - 更多的例子不会受到伤害 - 但我认为可以扩展通用公式以涵盖更多至少简单的案例。