Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 反转regexp替换_Python_Regex - Fatal编程技术网

Python 反转regexp替换

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

给定一个表示为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: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')