zoukankan      html  css  js  c++  java
  • Python-正则表达式

    一、正则表达式:制定一个匹配规则,找出符合这个规则的字符串

    1、元字符

    .    #匹配除换行符以外的任意字符
    w   #匹配字母或数字或下划线或汉字
    W   #匹配任何非字母数字或下划线或汉字
    s   #匹配任意的空白符,包括空格,制表符(Tab),换行符,中文全角空格等
    d   #匹配数字
    D   #匹配非数字字符
       #匹配一个开始或结束的位置
    ^    #匹配字符串的开始,如果放在字符串的开头,则表示取非。
    [^x] #匹配除了x之外的任何字符
    $    #匹配字符串的结束

    2、匹配次数

    *      #重复零次或多次
    +      #重复一次或更多次
    ?      #重复零次或一次
    {n}    #重复n次
    {n,}   #重复不少于n次
    {n, m} #重复n到m次

    3、懒惰限定符

    *?      #重复零次或多次,但尽可能减少重复
    +?      #重复一次或更多次,但尽可能减少重复
    ??      #重复零次或一次,但尽可能减少重复
    {n,}?   #重复不少于n次,但尽可能减少重复
    {n, m}? #重复n到m次,但尽可能减少重复

    4、范围

    [ ]         #用来匹配一个指定的字符类别
    [0-9]       #匹配0~9的数字,同d
    [a-z]       #匹配所有的小写字母
    [A-Z]       #匹配所有的大写字母
    [a-zA-Z]    #匹配所有的字母
    [a-z0-9A-Z] #等同于[a-z|0-9|A-Z]

    5、[ ] 和 | 的区别

    str1 = 'aaabbb'
    obj = re.findall(r'[ab]', str1)   #只匹配一个字符a或者b
    obj1 = re.findall(r'a|b', str1)   #只匹配一个字符a或者b
    obj2 = re.findall(r'[ab]+', str1) #匹配a或者b,可匹配多次;所以结果可包含a和b
    obj3 = re.findall(r'a+|b+', str1) #匹配多个a或者多个b;所以结果只能是多个a或者多个b
    print('obj: ', obj)
    print('obj1: ', obj1)
    print('obj2: ', obj2)
    print('obj3: ', obj3)

    查看结果:

    obj:  ['a', 'a', 'a', 'b', 'b', 'b']
    obj1:  ['a', 'a', 'a', 'b', 'b', 'b']
    obj2:  ['aaabbb']
    obj3:  ['aaa', 'bbb']

    二、匹配函数

    1、match( ) / search( ) / findall( )

    str1 = "Cats are so cute.Dogs are so cute.Cats are so cute."
    
    Obj = re.match(r'(w+) are so (w+)', str1)     #re.match()只从头开始匹配
    Obj1 = re.search(r'(w+) are so (w+)', str1)   #re.search()在整个字符串匹配,但只返回第一次匹配到的结果
    Obj2 = re.findall(r'(w+) are so (w+).', str1) #re.findall()在整个字符串匹配,返回所有匹配到的结果
    if Obj:
        print("Obj.group() : ", Obj.group())        #re.match()和re.search()要用group()获取结果
        print("Obj.group(1) : ", Obj.group(1))      #若存在分组,group()保存匹配的整个字符串;group(i)保存分组内的字符串
        print("Obj.group(2) : ", Obj.group(2))
    else:
        print("No match!!")

    查看结果:

    Obj.group() :  Cats are so cute
    Obj.group(1) :  Cats
    Obj.group(2) :  cute

    2、group( ) 和 groups( )

    str1 = "Cats are so cute.Dogs are so cute.Cats are so cute."
    
    Obj = re.match(r'(w+) are so (w+)', str1)     #re.match()只从头开始匹配
    Obj1 = re.search(r'(w+) are so (w+)', str1)   #re.search()在整个字符串匹配,但只返回第一次匹配到的结果
    Obj2 = re.findall(r'(w+) are so (w+).', str1) #re.findall()在整个字符串匹配,返回所有匹配到的结果
    
    print("Obj.group() : ", Obj.group())            #group()显示整个匹配的字符串
    print("Obj.groups() : ", Obj.groups())          #groups()只显示分组内的字符串
    print("Obj1.groups() : ", Obj1.groups())
    print("Obj2 : ", Obj2)                          #若存在分组,findall()只显示分组内的字符串

    查看结果:

    Obj.group() :  Cats are so cute
    Obj.groups() :  ('Cats', 'cute')
    Obj1.groups() :  ('Cats', 'cute')
    Obj2 :  [('Cats', 'cute'), ('Dogs', 'cute'), ('Cats', 'cute')]

    3、compile( )

    #match()/search()/findall():先自动编译正则表达式,再用编译后的正则表达式去匹配字符串
    res = re.compile(r'w+ are so w+') #若一个正则表达式要多次匹配,可先手动编译,提高效率
    obj = res.findall(str1))
    
    #等同于:
    obj = re.findall(r'w+ are so w+', str1)

    4、span( )获取匹配字符串的下标

    >>> str2 = 'Cats  are  so,,, cute'
    >>> print(re.search('w{4}', str2).span()) #只有match()和search()支持span(),findall()不支持

    (0, 4)

    三、split( ) 分割字符串:可指定多个字符串进行分割

    >>> str2 = 'Cats  are  so,,, cute'
    >>> obj4 = re.split(r'W+', str2)
    >>> obj5 = re.split(r'[s,]+', str2)
    >>> print(obj4)
    
    ['Cats', 'are', 'so', 'cute']
    
    >>> print(obj5)
    
    ['Cats', 'are', 'so', 'cute']

    四、sub( ) 和 subn( ) 替换匹配的字符串

    str1 = 'Cats are so cute'
    obj = re.sub('s', '-', str1, 0)   #匹配str1中的所有空格替换成-; 最后一个参数默认为0,表示替换所有
    obj1 = re.sub('s', '-', str1, 2)  #最后一个参数指定为2,表示只替换2次
    obj2 = re.subn('s', '-', str1, 0) #返回一个元组(替换后的字符串, 替换次数)
    obj3 = re.subn('s', '-', str1, 2)
    print('obj: ', obj)
    print('obj1: ', obj1)
    print('obj2: ', obj2)
    print('obj3: ', obj3)

    查看结果:

    obj:  Cats-are-so-cute
    obj1:  Cats-are-so cute
    obj2:  ('Cats-are-so-cute', 3)
    obj3:  ('Cats-are-so cute', 2)
  • 相关阅读:
    ABP 菜单 修改
    C# 过滤器
    RabbitMQ框架构建系列(三)——Net实现RabbitMQ之Producer
    RabbitMQ系列(二)RabbitMQ基础介绍
    RabbitMQ系列(一)AMPQ协议
    MVC 解读WebConfig
    MVC过滤器特性
    asp.net中使用JQueryEasyUI
    asp.net请求到响应的整个过程
    Redis的下载安装部署(Windows)
  • 原文地址:https://www.cnblogs.com/jessicaxu/p/7766465.html
Copyright © 2011-2022 走看看