一.re.sub 正则替换
Step 1. re.sub查找替换
re.sub参数:
pattern
repl
string
count=0 : 默认0,作用是无限替换下去
flags=0
#例子1
说明:找到Cream然后进行替换成Java
$ vim o8.py
import re
lanuage = 'CreamSandwichC#Python'
r = re.sub('Cream', 'Java', lanuage)
print(r)
#执行结果
$ python2.7 o8.py
JavaSandwichC#Python
#例子2
说明:re.sub count=0 将查找替换无限替换下去(若lanuage变量中有多个Cream将全部替换成Java)
import re
lanuage = 'CreamSandwichC#PythonCream'
r = re.sub('Cream', 'Java', lanuage, 0)
print(r)
#执行结果
$ python2.7 o8.py
JavaSandwichC#PythonJava
#例子3
说明:将count设置为1,将替换一个Cream,剩下的Cream不会被替换
import re
lanuage = 'CreamSandwichC#PythonCream'
r = re.sub('Cream', 'Java', lanuage, 1)
print(r)
#执行结果
$ python2.7 o8.py
JavaSandwichC#PythonCream
Step 2.replace 查找替换
replace 是re.sub的简化版,常规的替换可以使用replace,要实现一些超强的功能还是使用re.sub
import re
lanuage = 'CreamSandwichC#PythonCream'
lanuage = lanuage.replace('C#', 'Java')
print(lanuage)
#执行结果
$ python2.7 o8.py
CreamSandwichJavaPythonCream
Step3.1 re.sub 第二参数可以是函数
convert 函数是如何被re.sub所调用的? 调用流程又是什么?
如果把函数作为re.sub第二个参数传到参数列表之后运行流程是这样的:当正则表达式匹配到一个结果的时,会把匹配结果传到convert函数里来,所以说value就是正则表达所匹配的结果,也就是说convert 返回的结果将会替换C#.
为什么返回的结果C#消失了,因为什么都没有返回,C#被一个空的字符给替代了.
import re
lanuage = 'PythonC#JavaC#PHPC#'
def convert(value):
pass
r = re.sub('C#', convert, lanuage)
print(r)
#执行结果
$ python2.7 o9.py
PythonJavaPHP
Step3.2 re.sub 第二参数可以是函数
调用value.group方法拿到C#,matched表示匹配的字符串使用group得到matched
可以看到执行结果C#被动态的更改~~
import re
lanuage = 'PythonC#JavaC#PHPC#'
def convert(value):
matched = value.group()
return '~~'+ matched +'~~'
r = re.sub('C#', convert, lanuage)
print(r)
#执行结果
$ python2.7 o9.py
Python~~C#~~Java~~C#~~PHP~~C#~~
二.把函数作为参数传递
Step 1.实现字符串的替换
替换规则:找出字符串里的所有数字,凡是数字大于等于6的数字,统一替换成8,而小于6的数字,统一替换成0
import re
s = 'A8C37211D86'
def convert(value):
matched = value.group()
if int(matched) >= 6:
return '9'
else:
return '0'
r = re.sub('\d', convert, s)
print(r)
#执行结果
$ python2.7 o10.py
A9C09000D99