python 正则表达式与JSON-查+改(findall,sub)
1、findall:类似于个grep,比较主流。偏门的两个函数match 和 search也可以看看
#coding=utf-8 import re s = "A83C7D1D8E67" r1 = re.match('\d',s) r2 = re.search('\d',s) print(r1) print(r2.group()) # [Running] python -u "/Users/anson/Documents/Project/python_ToolCodes/test14.py" # None # 8
为什么match什么也没匹配到?因为match匹配的时候,查字符串的第一个字符,如果不是数字,那整个串都没必要匹配下去了
search,则会搜索整个字符串,直到找到第一个数字为止,然后把匹配到的第一个符合条件的字符返回。
总结:match和search 只会匹配一次,findall可以把所有匹配项目都匹配到。根据不同情况,使用不同函数,当然推荐使用findall
2、sub:类似于shell中的sed;当然replace 也可以实现替换,但功能比sub 要差很多
- 基础用法:
re.sub(old,new,a);a.replace(old,new)
sub:将串a的所有C#换成GO
#coding=utf-8 import re a = "PythonC#Java" r = re.sub("C#","GO",a) print(r) # [Running] python -u "/Users/anson/Documents/Project/python_ToolCodes/test13.py" # PythonGOJava
sub:讲串a的第一个C#换成GO
#coding=utf-8 import re a = "PythonC#JavaC#" r = re.sub("C#","GO",a,1) print(r) # [Running] python -u "/Users/anson/Documents/Project/python_ToolCodes/test13.py" # PythonGOJavaC#
replace:将串a的所有C#换成GO
#coding=utf-8 import re a = "PythonC#JavaC#" #r = re.sub("C#","GO",a,1) r = a.replace("C#","GO") print(r) # [Running] python -u "/Users/anson/Documents/Project/python_ToolCodes/test13.py" # PythonGOJavaGO
replace:将串a的第一个C#换成GO
#coding=utf-8 import re a = "PythonC#JavaC#" #r = re.sub("C#","GO",a,1) r = a.replace("C#","GO",1) print(r) # [Running] python -u "/Users/anson/Documents/Project/python_ToolCodes/test13.py" # PythonGOJavaC#
总结:re模块提供的sub函数的匹配功能要远强于 replace 这种内置函数,如果要实现超强匹配,推荐sub
- sub的高级用法 re.sub(old,new,a);new-还可以是函数
convert
-
#coding=utf-8 import re a = "PythonC#JavaC#" def convert(value): match = value.group() return "!!"+match+"!!" r = re.sub("C#",convert,a) print(r) # [Running] python -u "/Users/anson/Documents/Project/python_ToolCodes/test13.py" # Python!!C#!!Java!!C#!!
这段代码中,def convert(value):这个函数中,value是个对象、不是字符串
- 是这样的对象
Project/python_ToolCodes/test13.py" <_sre.SRE_Match object at 0x10a7ebbf8> <_sre.SRE_Match object at 0x10a7ebbf8> PythonJava
这个对象,其实对象实质上提供的信息是,(1)匹配的字符串是什么-“C#”,(2)标示C#在字符串a中的位置,(6,8),(12,14),。value.group() 可以返回这个对象的组成内容。
- 这个convert 函数返回的是一个字符串,也就是用这个字符串去替换老的字符串。
- 这种处理替换的能力主要用在哪些场景呢?比如我不是要替换C# ,而是利用正则表达式去替换一些我需要替换的类型
-
#coding=utf-8 import re a = "PythonC#JavaC#" def convert(value): match = value.group() return "!!"+match+"!!" r = re.sub("\D",convert,a) print(r) # [Running] python -u "/Users/anson/Documents/Project/python_ToolCodes/test13.py" # !!P!!!!y!!!!t!!!!h!!!!o!!!!n!!!!C!!!!#!!!!J!!!!a!!!!v!!!!a!!!!C!!!!#!!
那么,/D替换非数字,首先开发也许不知道是什么字符串,或者知道了也不可能是一个个字符去写 【比如r = re.sub("C",convert,a)】这种匹配吧,所以就概率是re.sub(old,new,a)中,old 是个正则表达式。这时候,如何去替换,如果是做同意标准的替换,那convert 就很省力气了,一个匹配模式,一个convert函数就可以省下好多事。还有convert里面还可以写很多逻辑,选择性匹配,让匹配多样性.
-
#coding=utf-8 import re a = "123456789" def convert(value): match = value.group() if int(match) > 5: return "!!"+match+"!!" else: return match r = re.sub("\d",convert,a) print(r) # [Running] python -u "/Users/anson/Documents/Project/python_ToolCodes/test13.py" # 12345!!6!!!!7!!!!8!!!!9!!
-
#coding=utf-8 import re a = "abc123456789acf" def convert(value): match = value.group() return '5' r = re.sub("a[bc|cf]{1,3}",convert,a) print(r) # [Running] python -u "/Users/anson/Documents/Project/python_ToolCodes/test13.py" # 51234567895