关于本站
1、基于Django+Bootstrap开发
2、主要发表本人的技术原创博客
3、本站于 2015-12-01 开始建站
分享一下我在某个项目碰到的替换需求。
在替换时有些替换规则比较复杂。无法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)的意思,左右两边满足其一即可。更多用法大家可以自行试验。