zoukankan      html  css  js  c++  java
  • re模块正则表达式

      什么是正则表达式?

      正则表达式是一个特殊的字符序列,它能够帮助你方便的检查一个字符串是否能够与某种模式匹配。

      re的匹配语法有以下几种

      1、re.match 从头开始匹配 注:只有第一个字符匹配才会返回值,如果第一个字符不匹配则返回None

      2、re.search 匹配包含(全局匹配) 注:当存在多个匹配到的字符时,只返回第一个。例如:s = 'ad1jkn3nj'   re.search('[0-9]', s) 返回<re.Match object; span=(2, 3), match='1'>

      3、re.findall 把所有匹配到的字符放到以列表中的元素返回

      4、re.split     以匹配到的字符当作列表分隔符,(注:maxsplit为替换次数)

    1 import re
    2 s = '31-213*312/1321+1321'
    3 print(re.split("[-*/+]", s, maxsplit=2)) #-*/+分割数字;[]是包含的意思 结果 ['31', '213', '312/1321+1321']

      5、re.sub      匹配字符并替换(注:count为替换次数)

    1 import re
    2 s = 'dsadsakl1321aa|d21321darewr$d1321afds'
    3 print(re.sub('d+', "=", s, count=2))  # 把数字替换成"=" 结果 dsadsakl=aa|d=darewr$d1321afds

      6、re.fullmatch 全部匹配;整个字符串全部匹配成功就返回re object,否则返回None 例如:re.fullmatch('ads', 'asd')  返回re object

      7、re.compile  与re.fullmatch 类似。速度相对re.fullmatch 快一点。(先存储到内存里然后直接调用,re.fullmatch的话每次都要匹配,影响效率)

    1 import re
    2 pattern = re.compile("\w+@\w+\.(com|cn|edu)")
    3 result = pattern.fullmatch('kevin@cnblogs.com')
    4 print(result)print(result)   # 结果<re.Match object; span=(0, 17), match='kevin@cnblogs.com'>

      常用的表达式规则

      '.'    默认匹配除 之外的任何一个字符,例如:re.search('.', 'abca') 结果 <re.Match object; span=(0, 1), match='a'> 注:当'..'时,返回ab,若指定flag DOTALL,则匹配任意字符,包括换行。

      '^'      匹配字符开头,例如:re.search('^ab', 'abca') 结果 <re.Match object; span=(0, 1), match='ab'> ,若指定flags MULTILINE,这种也可以匹配上(r''^a'', '' abc eee'', flags=re.MULTILINE)

      '$'      匹配字符结尾,例如:re.search('b$', 'ab') 结果 <re.Match object; span=(0, 1), match='b'> ,若指定flags MULTILINE,re.search('foo.$', 'foo1 foo2 ', re.MULTILINE).group() 会匹配到foo1

      '*'    匹配*号前的字符0次或多次,re.search('a*' , 'aaabhdjhbas')  结果'aaa'

      '+'      匹配前一个字符1次或多次,re.findall('ab+', 'ab+cd+abb+bba') 结果['ab', 'abb']

      '?'      匹配前一个字符1次或0次,re.search('b?', 'bkevinb').group() 匹配到第一个b,当第一个字符不是b时匹配为0次

      '{m}'          匹配前一个字符m次(注:匹配的字符必须连在一起),re.search('b{3}', 'kevinbbbb6').group() 匹配到 'bbb'

      '{n, m}'   匹配前一个字符n到m次,re.findall('ab{1,3}', "abb abcabbcbbb") 结果['abb', 'ab', 'abb']

      '|'    匹配|左或|右的字符(注:当两个都存在时,现匹配到那个输出那个),re.search("abc|ABC", "ABCBabcADSA").group() 结果 ABC。re.search("[a|A]BC", "aBCADSA").group() 结果 aBC

      '(...)'    分组匹配,re.search("(abc){2}a(123|45)", "abcabca123qeq").groups() 结果('abc', '123'),例如:re.search("([a-z]+)([0-9]+)", "kevin1231").groups())  结果 ('kevin', '1231')

      'A'      只从字符开头匹配,re.search("Aabc", "kevinabc") 返回None是匹配不到的  同'^'

      ‘[]’     匹配范围(从开头开始匹配),re.search("([a-z]+)([0-9]+)", "kevin1231").groups()  结果 ('kevin', '1231')

      ''      匹配字符结尾,同$

      'd'      匹配数字0-9

      'D'     匹配非数字

      'w'     匹配[A-Za-z0-9]

      'W'    匹配非[A-Za-z0-9]

      's'      匹配空白字符、 、 、 ,re.findall('s+', "ab dsa sdsa ") 果[' ', ' ', ' ']

       '(?P<name>...)'    分组匹配s = '1366597199609090054'  方法一:re.search("(?P<province>d{3})(?P<city>d{3})(?P<year>d{4})", s) .groups() 结果('136', '659', '7199')

                       方法二:res = re.search("(?P<province>d{3})(?P<city>d{3})(?P<year>d{4})", s) 

                           res.groupdict()  结果{'province': '136', 'city': '659', 'year': '7199'}  

      转义

      当要以'|'分割时要转义写为'|" 当s中存在""时,系统会自动生成"\"所以转义时要写成"\"

    import re
    s = 'dsadsakl1321aa|ddarewr$d1321afds'
    print(re.split("\|d+|||$", s))

      结果 ['dsa', 'dsakl', 'aa', 'ddarewr', 'd', 'afds']

      Flags标志符

      1、re.I(re.IGNORECASE):忽略大小写(括号内是完整写法,下同)例如: re.search('k', 'Kevin', re.I)  结果 <re.Match object; span=(0, 1), match='K'>

      2、M(MULTILINE): 多行模式,改变'^'和'$',的行为 例如:re.search('foo.$', 'foo1 foo2 ', re.MULTILINE).group() 会匹配到foo1

      3、S(DOTALL): 改变'.'的行为   例如:re.search('.', ' ', re.S) 结果       如果不re.S的话则显示None

      4、X(re.VERBOSE) 可以给你的表达式写注释,使其更可读。

      例如:

    import re
    s = '31-213*312/1321+1321'
    print(re.split("[-*/+] # test", s,re.X,))
  • 相关阅读:
    搭建zabbix监控
    liunx 下ctrl+D问题解决方案
    linux配置双线策略
    Discuz! X2.5读写分离
    慢谈MYSQL常用SQL语句
    CentOS 6.5系统安装配置LAMP(Apache+PHP5+MySQL)服务器环境
    自动抓包shell脚本
    zabbix实施部署原理架构
    ftp搭建教程
    DNS搭建教程
  • 原文地址:https://www.cnblogs.com/Kevin-kong/p/10991947.html
Copyright © 2011-2022 走看看