Python正则使用函数替换

分享一下我在某个项目碰到的替换需求。

在替换时有些替换规则比较复杂。无法1个词或多个词直接简单替换。

这时可以使用正则表达式实现替换功能。例如如下内容:

content = '34jehsekh413kjlwjk352121j5h43j5'

现在需要把一个数字和一个字母组合替换成"("左括号,再把一个字母和一个数字的组合替换成")"右括号。

注意我说的数字和字母顺序,例如:"4j"将替换成"(";"j4"将替换成")"。

这里使用普通的replace函数处理会比较麻烦。

看看正则表达式如何处理。代码如下:

#coding:utf-8

#引入正则表达式模块
import re

#替换方法
def repl_text(content):
    text = re.sub(r'\d[a-z]', '(', conetnt)
    text = re.sub(r'[a-z]\d', ')', text)
    return text

if __name__ == '__main__':
    #原文本内容
    content = '34jehsekh413kjlwjk352121j5h43j5'

    #执行替换并输出结果
    print(repl_text(content))

这里re.sub有三个参数re.sub(替换内容的正则表达式, 替换结果, 要被替换的文本内容)。

正则表达式\d表示数字,[a-z]表示小写字母。分两次替换,结果为:

'3(ehsek)1(jlwj)5212((4(5'

那么,替换规则再复杂些呢?复杂到无法通过1次或几次正则替换得到结果。

例如再加个条件,如果是数字4开头的不替换。这个可以在修改第1条正则表达式。

好吧,我这是为了引出re模块可以使用函数处理替换。

接下来演示一下方法:

#coding:utf-8
import re

#替换方法
def repl_method(match):
    #匹配到的内容
    text = match.group()
    
    #判断是不是字母和数字组合
    if re.search(r'^[a-z]\d$', text):
        result = ')'
    elif text[0]=='4':
        #判断开头是否是4,若是的话,返回原文本
        result = text
    else:
        result = '('
    
    #返回替换的结果
    return result
    
if __name__ == '__main__':
    content = '34jehsekh413kjlwjk352121j5h43j5'
    
    text = re.sub(r'\d[a-z]|[a-z]\d', repl_method, content)
    print(text)

和前面不同,sub方法的第2个参数不在是使用具体的内容,而是使用一个方法。

定义了一个repl_method方法给re.sub替换内容使用。

该方法将接受一个match对象,最后返回内容即可。该内容就是每次匹配到的内容所需要替换的结果。结果如下:

'34jehsek)1(jlwj)5212((4(5'

另外,这次使用匹配的正则表达式有个“|”号,该符号是二选一(or)的意思,左右两边满足其一即可。更多用法大家可以自行试验。

评论列表

暂无评论,欢迎来抢沙发!

新的评论

清空