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

     

posted @ 2020-08-06 17:03  XiaoLee-C  阅读(658)  评论(0编辑  收藏  举报