给定表示为正则表达式替换的字符串转换,是否有一种方便的方法来反转该转换,最好是在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。
答案 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
我不完全确定你所追求的是什么 - 更多的例子不会受到伤害 - 但我认为可以扩展通用公式以涵盖更多至少简单的案例。