Python成长记十(正则表达式)

正则表达式
  1、定义:正则表达式是一个特殊的字符序列,能方便的检测一个字符串是否与某种特定的模式匹配(比如快速检索文本、实现一些替换文本的操作)。
  应用场景:1.检索一串数字是否为电话号码   
           2.检测一个字符串是否为email
           3.把一个文本里指定的单词替换为另一个单词等
  2、使用内置函数判断是否包含:
  例如:
    a = 'C|c++|Java|Python|Javascript|c#'
print(a.index('Python')>-1)
print('Python' in a)
结果:True True


  3.正则表达式的使用
   案例1:
    import re
a = 'C|c++|Java|Python|Javascript|c#'
res = re.findall('Python',a) #普通字符
print(res)
结果:['Python']
总结:'Python' 是普通字符
案例2:
import re
a = 'C|c++|Java|Python|Javascript|c#'
res = re.findall('Python',a)
if len(res) >0:
    print('字符串中包含Python')
    结果:字符串中包含Python


    总结:1、导入re模块 
         2、findall(parttern,string,flags)方法
    案例3:
    import re
a = 'C9c++5Java2Python0Javascript1c#'
#提取数字
res = re.findall('\d',a) #\d表示数字0到9
print(res)
结果:['9', '5', '2', '0', '1']
总结:\d 是元字符
        相关元字符见底下截图。

案例4:
import re
a = 'C9c++5Java2Python0Javascript1c#'
#查找非数字
res = re.findall('\D',a) #\D表示非数字
print(res)
结果:
['C', 'c', '+', '+', 'J', 'a', 'v', 'a', 'P', 'y', 't', 'h', 'o', 'n', 'J', 'a', 'v', 'a', 's', 'c', 'r', 'i', 'p', 't', 'c', '#']

3.字符集
案例5:
import re
a = 'abc, acc, adc, aec, afc, ahc'
#找出中间是c或者f的单词
res = re.findall('a[cf]c',a) #[]表示匹配一个或多个字符,关系是或关系
print(res)
结果:['acc', 'afc']
    案例6:
        import re
a = 'abc, acc, adc, aec, afc, ahc'
#找出中间不是c或者f的单词
res = re.findall('a[^cf]c',a) 
print(res)
结果:['abc', 'adc', 'aec', 'ahc']
    案例7:
        import re
a = 'abc, acc, adc, aec, afc, ahc'
#找出中间是c到f的单词
res = re.findall('a[c-f]c',a) #[]表示匹配一个或多个字符,关系是或关系
print(res)
结果:['acc', 'adc', 'aec', 'afc']

4.概括字符集(比如\d,\D)
案例8:
    import re
a = 'python123456java98javascript'
res = re.findall('[0-9]',a) #和\d的结果一样
print(res)
    结果:['1', '2', '3', '4', '5', '6', '9', '8']
    案例9:
        import re
a = 'python123456java98javascript'


res = re.findall('[^0-9]',a) #和\D的结果一样
print(res)
结果:['p', 'y', 't', 'h', 'o', 'n', 'j', 'a', 'v', 'a', 'j', 'a', 'v', 'a', 's', 'c', 'r', 'i', 'p', 't']
    案例10:
        import re
a = 'python#123456 java$98javascript_'
#匹配所有的字母和数字
res = re.findall('\w',a) #\w匹配单词字符
print(res)
结果:['p', 'y', 't', 'h', 'o', 'n', '1', '2', '3', '4', '5', '6', 'j', 'a', 'v', 'a', '9', '8', 'j', 'a', 'v', 'a', 's', 'c', 'r', 'i', 'p', 't', '_']
    总结:\w匹配所有的字母和数字


    案例11:
        import re
a = 'python#123456 java$98javascript_'
#匹配所有的字母和数字
res = re.findall('[A-Za-z0-9_]',a) #和\w效果一样
print(res)
案例12:
    import re
a = 'python#123456 java$98javascript_'
#匹配所有的非字母和数字
res = re.findall('\W',a) #\W匹配所有非单词字符
print(res)
结果:['#', ' ', '$']


案例13:
    import re
a = 'python#123456 java$98javascript_\r'
#匹配所有空白字符
res = re.findall('\s',a) #\s匹配空格字符
print(res)
结果:[' ', '\r']
总结:\s 匹配空格字符 \S 匹配非空格字符


5.数量词
    import re
a = 'python#123456 java$98javascript_\r'
#匹配所有编程语言
res = re.findall('[a-z]{3,10}',a) #{}表示重复的次数
print(res)
结果:['python', 'java', 'javascript']


6.贪婪 与 非贪婪(默认是贪婪的模式)
(1)贪婪:以案例5为例,以匹配时以最大的数为准开始匹配直到匹配到都不满足条件为止


(2)非贪婪:表示方法在数量词后边加问号(?)
比如:
    import re
a = 'python#123456 java$98javascript_\r'
#匹配所有编程语言
res = re.findall('[a-z]{3,10}?',a) #{}表示重复的次数
print(res)
结果:['pyt', 'hon', 'jav', 'jav', 'asc', 'rip']
总结:找到3个(以最小的数匹配)就默认匹配成功

7、匹配0次1次或者无限多次星号(*)
案例:
    import re
a = 'pytho0python1pythonn2'
#* 匹配0次或者无限多次
res = re.findall('python*',a) 
print(res)
结果:['pytho', 'python', 'pythonn']


8、匹配1次或者无限多次加号(+)
案例:
        import re
a = 'pytho0python1pythonn2'
#+匹配1次或者无限多次
res = re.findall('python+',a) 
print(res)
结果:['python', 'pythonn']


9、匹配0次或者1次问号(?)
    案例:
        import re
a = 'pytho0python1pythonn2'
#? 匹配0次或者1次
res = re.findall('python?',a) 
print(res)
结果:['pytho', 'python', 'python']


10、与贪婪模式中问号的区别(贪婪模式中?号前面是范围)
案例:
    import re
a = 'pytho0python1pythonn2'
#与贪婪模式中问号的区别
res = re.findall('python{1,3}?',a) #{}表示重复的次数
print(res)
结果:['python', 'python']


11、边界匹配符(^表示从字符串开始匹配,$表示从字符串末尾开始匹配)
案例:(匹配3~6位的数字)
    import re
a = '12000'
#匹配3~6位的数字
res = re.findall('^\d{3,6}$',a) #{}表示重复的次数
print(res)
结果:['12000']


12.组(小括号()且关系)
案例:(判断是否包含3个Python)
    import re
a = 'PythonPythonPythonPython'
#判断是否包含3个Python
res = re.findall('(Python){3}',a) #()且关系
print(res)


13、匹配模式参数
案例:
    import re
    a = 'PythonPythonC#PythonPythonPHPC++'
#忽略字母大小写
res = re.findall('c#',a,re.I) #()且关系
print(res)
结果:['C#']
案例2:(匹配多个模式的字符)
对比:点号(.)匹配除换行符\n之外其他所有字符
    import re
a = 'PythonC#\nJavaPHP'
#忽略字母大小写
res = re.findall('c#.{1}',a,re.I | re.S) #re.S可以忽略点号的行为
print(res)


    14、re.sub正则替换
     用法:re.sub(pattern,repl,string,count=0,flags=0)
     案例1:
        import re
a = 'PythonC#JavaPHP'
res = re.sub('C#','GO',a)
print(res)
结果:PythonGOJavaPHP
案例2:
import re
a = 'PythonC#JavaC#PHP'
res = re.sub('C#','GO',a,1) #0表示无限次替换,1表示替换1次
print(res)
结果:PythonGOJavaC#PHP
案例3:
使用字符串内置函数:
    import re
a = 'PythonC#JavaC#PHP'
res = a.replace('C#','GO')
print(res)
结果:PythonGOJavaGOPHP

案例4:
被替换的目标可以是一个函数:
    import re
a = 'PythonC#JavaC#PHPC#'
def convert(value):
    matched = value.group()
    return '!'+matched+'!'


res = re.sub('C#',convert,a) #0表示无限次替换,1表示替换1次


print(res)
结果:Python!C#!Java!C#!PHP!C#!


案例5:把函数作为参数传递
目的:替换数字大于6的为8,替换数字小于6的为0
    import re
a = 'A8D3456789G'
def convert(value):
    matched = value.group()
    if int(matched) >= 6:
        return '8'
    else:
        return '0'


res = re.sub('\d',convert,a) #\d表示先找到所有的数字


print(res)


结果:A8D0008888G
    
    15、search与match函数
     区别:match从第一个字符开始匹配,如果没有匹配成功则返回None,search搜索整个字符串直到找到与之匹配的即可,返回一个对象。(一旦匹配成功则立即停止搜索)
     案例1:
        import re
a = 'A8D3456789G'
res = re.match('\d',a)
res1 = re.search('\d',a)
print(res)
print(res1)
结果:
None
    <_sre.SRE_Match object; span=(1, 2), match='8'>


     案例2:返回相应的值或者位置
        import re
a = '8D3456789G'
res = re.match('\d',a)
res1 = re.search('\d',a)


print(res.span())
print(res1.group())
结果:
(0, 1)
    8
    总结:如果使用findall()则返回一个列表


    16、group分组
    案例1:
        import re
a = 'life is short,I use python'
#获取life和python之间的单词
res = re.search('life(.*)python',a)


print(res.group(1)) #0返回完整匹配结果
结果: is short,I use 


案例2:
使用findall()
    import re
a = 'life is short,I use python'
#获取life和python之间的单词
res = re.findall('life(.*)python',a)


print(res)
结果:[' is short,I use ']


案例3:
    import re
a = 'life is short,I use python,I love python'
#获取life和python之间的单词
res = re.search('life(.*)python(.*)python',a)


print(res.group(0,1,2))
结果:('life is short,I use python,I love python', ' is short,I use ', ',I love ')


案例4:groups()的使用
    import re
a = 'life is short,I use python,I love python'
#获取life和python之间的单词
res = re.search('life(.*)python(.*)python',a)


#print(res.group(0,1,2))
print(res.groups())

结果:(' is short,I use ', ',I love ')

元字符包括哪些(来自百度百科)见截图:

Python成长记十(正则表达式)