zoukankan      html  css  js  c++  java
  • Python-re模块

    re 正则表达式

      正则表达式是一种小型的,高度专业化的编程语言,在各种语言中都有涉及,在Python中,通过re模块实现。正则表达式模式被编译成一系列的字节码,然后由c编写的匹配引擎执行。

    一、正则表达式的作用:

      1、对字符串进行模糊匹配

      2、对象就是字符串

    二、字符匹配(普通字符,元字符)

      1、普通字符:数字字符和英文字母和自身匹配

      2、元字符: . ^ $ * + ? {} [] () |     (11个)

      调用方法:re.方法(‘规则’,‘匹配的字符串’) ## 可以匹配除了 (换行符) 外的任意一个字符。

    三、匹配规则则:

    . 匹配任意字符,除了  
       转义字符
    []   匹配字符集
    d 匹配任意十进制数,相当于[0-9]
    D 匹配任意非十进制数,相当于[^0-9]
    s 匹配任何空白字符,它相当于[ fv]
    S 匹配任何非空白字符,它相当于[^ fv]
    w 匹配任何数字字母,相当于[a-zA-Z0-9]
    W 匹配任何非数字字母,相当于[^a-zA-Z0-9]
    * 匹配前一个字符0或无限次
    + 匹配前一个字符1次或无限次
    匹配前一个字符0次或1次
    {m}{m,n} 匹配前一个字符m次或最少m次最多n次
    *? 匹配模式变为非贪婪模式(默认都是贪婪模式)
    ^ 匹配字符串开头,多行模式中匹配每一行的开头
    $ 匹配字符串结尾,多行模式中匹配每一行的结尾
    A 仅匹配字符串的开头
     仅匹配字符串的结尾
     匹配一个单词的边界,也就是指单词和空格间的位置
    | 或者
    (ab) 括号中的表达式最为一个分组
    <number> 引用编号为num的分组匹配到的字符串
    (?P<key>value) 匹配到一个字典,
    (?P=name) 引用别名为name的分组匹配字符串

    四、举例:

      findall()用法:找到匹配,返回所有匹配部分的列表

    1 s = 'jerry22jack23tom24'
    2 print(re.findall('d+',s))
    3 
    4 --------->输出
    5 
    6 ['22', '23', '24'] #列表的形式显示
    1 print(re.findall('j...y',s))  # . 的作用:匹配任意一个字符
    2 
    3 --------->输出
    4 
    5 ['jerry'] 
    1 print(refindall('I','I im LIst')
    2 
    3 ------->输出
    4 
    5 ['I','I']
    1 re.findall("d*","adsxaeddddddddddddyxsk19arrx") 
    2 
    3 ----------->输出
    4 
    5 ['', 'd', '', '', '', '', 'dddddddddddd', '', '', '', '', '', '', '', '', '', '', '']
    1 re.findall("alex*","asdhfalexxx")
    2 
    3 ----------->输出
    4 
    5 ['alexxx']
    1 re.findall("alex+","asdhfalexxx")
    2 
    3 ----------> 输出
    4 
    5 ['alexxx']
    1 re.findall("alex*","asdhfale") 
    2 
    3 --------->输出
    4 
    5 ['ale']
    re.findall("alex?","asdhfale")
    
    --------->输出
    
    ['ale']
    re.findall("alex{1,}","asdhfalexx")
    
    ---------->输出
    
    ['alexx']
    re.findall("alex{0,}","asdhfalexx")
    
    --------->输出
    
    ['alexx']
    re.findall("alex{0,1}","asdhfalexx")
    
    ---------->输出
    
    ['alex']
    re.findall("alex{6}","asdhfalexxxxxx")
    re.findall("alex{0,6}","asdhfalexx")
    re.findall("x[yz]","xyuuuu")   
    
    ---------->输出
    
    ['xy']
    re.findall("x[yz]","xyuuxzuu")
    
    --------->输出
    
    ['xy', 'xz']
    re.findall("x[yz]p","xypuuxzpuu") 
    
    --------->输出
    
    ['xyp','xzp']
    1  re.findall("q[a-z]*","quo")
    2 
    3 --------->输出
    4 
    5 ['quo']
    re.findall("q[a-z]*","quogjgkjjhk") 
    
    --------->输出
    
    ['quogjgkjjhk']
    1 re.findall("q[0-9]*","quogjgkjjhk9")
    2 
    3 --------->输出
    4 
    5 ['q']
    1 re.findall("q[^a-z]","q213") 
    2 
    3 ---------->输出
    4 
    5 ['q2']

    !!!! 元字符 就是让有意义的元字符变成没有意义,让无意义的变得有意义

    re.findall("d","12+(34*6+2-5*(2-1))")
    
    --------->输出
    ['1', '2', '3', '4', '6', '2', '5', '2', '1']
    1 re.findall("d+","12+(34*6+2-5*(2-1))") 
    2 
    3 --------->输出
    4 
    5 ['12', '34', '6', '2', '5', '2', '1']
    1  re.findall("[D]+","12+(34*6+2-5*(2-1))") 
    2 
    3 ---------->输出
    4 
    5 ['+(', '*', '+', '-', '*(', '-', '))']
     re.findall("D+","hello world")
    
    ----------->输出
    
    ['hello world']
    re.findall("S+","hello world") 
    
    --------->输出
    
    ['hello', 'world']
    1 re.findall("w","hello world_") # 注意这个下划线
    2 
    3 --------->输出
    4 
    5 'h', 'e', 'l', 'l', 'o', 'w', 'o', 'r', 'l', 'd', '_']
    re.findall("www.baidu","www/baidu")
    
    ---------->输出
    
    ['www/baidu']
    re.findall("www.baidu","wwwobaidu")
    
    -----------输出
    
    ['wwwobaidu']
    1 re.findall("www.baidu","www
    baidu")
    2 
    3 -------->输出
    4 
    5 []
    1 re.findall("www.baidu","www.baidu")
    2 
    3 ---------->输出
    4 ['www.baidu']
    re.findall("www*baidu","www*baidu")
    
    ------------》
    
    ['www*baidu']
    1 re.findall(r"I","I am LIST") # re的r =\ ,就相当转义两次
    2 3 ---------->输出 

    4 5 ['I']
    1  re.findall("I\b","I am LIST")
    2 
    3 ----------->
    4 
    5 ['I']

      python解释器\ 两个,re转义\ 两个,所以是\\ 四个

    1 re.findall("c\\l","abclerwt")
    2 
    3 ---------4 
    5 ['c\l']
     1 import re
     2 
     3 m = re.findall('blow', 'blow') # 'blow' 中b顶头,算是特殊边界
     4 # 在python中有特殊意义,传给re 是以它在python解释器中的特殊意义传给re的,所以
     5 # re 并不是识别到,而是一个特殊意义
     6 print(m)
     7 
     8 
     9 m1 = re.findall(r'blow', 'blow') # r 告诉re  是原生字符 ,re再解释就是具有的意思
    10 print(m1)
    11 
    12 
    13 m2 = re.findall('\bblow', 'blow')
    14 print(m2)
    15 # 先将'\\bblow' 传入python解释器 ,在python解释器中一个是有特殊意义,两个\表示一个
    16 # 再传入 re 中,也是有特殊意义,所以两个\b
    17 # 因为返回应该是一个  ,但是一个 在python解释器中有特殊意义,所以返回时做了处理的
    re.findall(r"ka|b","sdjkasf")
    
    --------->输出
    
    ['ka']
    re.findall(r"ka|b","sdjkbsf") #  #匹配ka或b ,|将左右分开
    
    ----------.>输出
    
    ['b']
    1 re.findall("(abc)+","abcabc" ) # 默认是显示()里的
    2 
    3 ----------->输出
    4 
    5 ['abc']
    1 re.findall("(?:abc)+","abcabc" ) #加上?:就取消了限制
    2 
    3 ------------4 
    5 ['abcabc']

    search 函数会在字符串内查找模式匹配,只到找到第一个匹配然后返回一个包含匹配信息的对象,该对象可以

    通过调用group()方法得到匹配的字符串,如果字符串没有匹配,则返回None。

     1 re.search("(?P<name>w+)","abcccc")
     2 
     3 ---------------- 4 
     5 <_sre.SRE_Match object; span=(0, 6), match='abcccc'>  #匹配成功了,返回的就是对象
     6 
     7 ----------------》通过group调用
     8 
     9 print(re.search("(?P<name>w+)","abcccc").group('name'))
    10 
    11 -----------------12 
    13 ‘abcccc’
    1 re.search("(?P<name>[a-z]+)","alex36wusir34xialv33")  #<>的作用就是把内容进行分组
    2 
    3 ------------------》
    re.search("[a-z]+","alex36wusir34xialv33").group()   #匹配包含a-z的内容,+号的作用就是重复
    
    -------------------------'alex'
    1 re.search("(?P<name>[a-z]+)d+","alex36wusir34xialv33").group("name")   #通过分组,可以给group传叁数,找出你想要的信息
    2 
    3 
    4 ----------------------------5 
    6 ‘alex'
    1 re.search("(?P<name>[a-z]+)d+","alex36wusir34xialv33").group() ------------> alex36
    2 
    3 
    4 re.search("(?P<name>[a-z]+)d+","alex36wusir34xialv33").group('name')-------------> alex
    re.search("(?P<name>[a-z]+)(?P<age>d+)","alex36wusir34xialv33").group("age")
    
    ------------------------>
    
    '36'

    re模块下常用的方法:

      

    match与search区别:  

    ---- re.match只匹配字符串的开始,如果字符串开始不符合正则表达式,则匹配失败,函数返回None;而re.search匹配整个字符串,直到找到一个匹配。

    split:

    ret=re.split('[ab]','abcd') #以a或者b分隔
    
    --------》
    
    ['','','cd']
    re.split(" ","hello abc def")   #匹配中间带有空格的
    
    
    ------------->
    
    ['hello', 'abc', 'def']

      

    re.split("[ l]","hello abcldef") # 以空格或 l  区分
    
    ---------》
    
    ['he','','o',abc','def']
    re.split("[ab]","asdabcd")
    
    -------------》
    
    ['', 'sd', '', 'cd']

    sub 替换

    re.sub("d+","A","jaskd4234ashdjf5423")   #把所有数字替换为A(4234替换为A)
    
    ---------->
    
    'jaskdAashdjfA' 
    
    
    
    ### 并不是改变原字符串,而是生新的字符串
    re.sub("d","A","jaskd4234ashdjf5423",4)   #指定替换次数 4,只替换前面4个数字
    -------------------------->
    
    'jaskdAAAAashdjf5423'

    subn

    ret=re.subn('d','abc','alvin5yuan6')    #第一个匹配元组,第二个匹配次数
    print(ret)
    ------------------
    
    ('alvinabcyuanabc', 2)

    compile 编译

    com=re.compile("d+")     #编译好了一次,下次再用,直接就调用他,不用再编译,提高匹配速度
    
    com.findall("fjlksad234hfjksd3421")   #可以匹配多次

    finditer(迭代器)当数据非常多的时候,他会把数据存在迭代器中,不会放在内存中,用一条处理一条。

    ret=re.finditer("d","sdfgs6345dkflfdg534jd")  
    next(ret).group()      #拿到结果
    '6'
    next(ret).group()
    '3'
    next(ret).group()
    '4'
    next(ret).group()
    '5'
    next(ret).group()
    '5'
    next(ret).group()
    '3'
    next(ret).group()
    '4'

    匹配手机号:

    1 phone_num = '13001000000'
    2 a = re.compile(r"^1[d+]{10}")
    3 b = a.match(phone_num)
    4 print(b.group())

    匹配IPv4

    1 # 匹配IP地址
    2 ip = '192.168.1.1'
    3 a = re.compile(r"(((1?[0-9]?[0-9])|(2[0-4][0-9])|(25[0-5])).){3}((1?[0-9]?[0-9])|(2[0-4][0-9])|(25[0-5]))$")
    4 b = a.search(ip)
    5 print(b)

    匹配E-mail

    1 email = '630571017@qq.com'
    2 a = re.compile(r"(.*){0,26}@(w+){0,20}.(w+){0,8}")
    3 b = a.search(email)
    4 print(b.group())
    为什么要坚持,想一想当初!
  • 相关阅读:
    QT 5 安装 vs2017 后,出现找不到 rc.exe 问题
    git push -f
    使用druid连接池的超时回收机制排查连接泄露问题
    git 记住密码
    postgresql c library use
    jvm内存溢出分析
    Maven中使用本地JAR包
    执行Git命令时出现各种 SSL certificate problem 的解决办法
    transformer模型计算图
    jieba分词单例模式及linux权限不够情况下tmp_dir自定义
  • 原文地址:https://www.cnblogs.com/JerryZao/p/8670734.html
Copyright © 2011-2022 走看看