Skip to main content
 首页 » 编程设计

python之正则表达式替换 : how to indent a variable number of lines in the middle of the rest of the match

2025年05月04日24shanyou

这是我在 vim 的正则表达式方面遇到的问题,但 python 正则表达式也会有所帮助并受到欢迎。让我们以这个 python 函数为例:

def func_hello (*args): 
    for arg in args: 
        print 'Hello, %s!' % arg 

我想用 method_hello 方法(我实际上并没有这样命名)将它变成类中的一个方法(不是真的 - 只是在这个例子中)。我可以这样做:

:%s/def func_\(\w*\) (\(.*\)):\(\(\n\s\+.*\)\+\)/class \u\1 (object):\r\tmethod_\1 (self, \2):\r\t\3/g 

但是,这给了我这个:

class Hello (object):  
    method_hello (self, arg1, arg2, arg3):  
 
    for arg in arg1, arg2, arg3:  
        print 'Hello, %s!' % arg  

我试图做这样的事情来收集多行(它确实如此)

\(\(\n\s\+.*\)\+\) 

...然后用这个缩进它们(它没有)

\r\t\3 

...因为我不知道如何在匹配中的每一行前面加上制表符。我的正则表达式中似乎需要一个正则表达式,以匹配可变数量的行并在每行前面加上制表符。

有办法吗?

请您参考如下方法:

不确定是否可以使用正则表达式来完成。但如果目标是在 Vim 中使用快捷方式,那么这就是您想要的:

nmap <yourkey> vip>Oclass Hello(object):<esc>+f(aself, <esc>

或者类似的东西。在我遇到的大多数情况下,在 vim 中根据其他热键定义热键更容易。