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

    字符串是我们在编程的时候经常用到的一种数据类型,检查会在字符串里面查找一些内容,对于比较简单的查找,字符串的一些内置的方法就可以处理,对于比较复杂的字符串,或者有一些内容经常变化的字符串查找,那么我们就要引用正则表达式了,正则表达式就是用来匹配一些比较复杂的字符串

    re 模块

    在python中,如果使用正则表达式的话,需要导入re模块,re模块是一个内置模块,直接import就可以使用。

    import re

    s = 'be is good is int is '

    匹配字符串的几个方法

    1. re.match :
      方法接受3个参数,第一个是匹配的规则,也就是正则表达式,第二个就是要查找的字符串,第三个参数不是必填的,用于匹配正则表达式的匹配方式,文章末尾有正则表达式的匹配模式的讲述。
      match方法是从字符串中第一个单词中匹配字符串,匹配到就返回一个对象,如果匹配不到,则返回None,而且
      必须匹配上第一个单词才行,不然就会报错

    e.g
    print(re.match(r"be",s).group()) 加上group才能输出显示结果
    运行结果:be
    print(re.match(r"good",s).group())
    运行结果:报错

    1. re.search:
      search方法的参数和match一样,和match不一样的是match是从字符串里卖弄的第一个单词里面找,search方法则是从字符串的整个内容找,如果找到了了只返回第一个,找不到就返回None。

    print(re.search(r"is",s).group())
    运行结果:is

    1. re.findall:
      findall方法在参数上和match和search一样,和他们不一样的是,findall会返回所有结果到一个list里面,把所有匹配到的字符串,放到list里,如果找到了只返回第一个,找不到就返回一个空的list

    print(re.findall('is',s))
    运行结果:['is']

    1. re.sub:
      sub 方法和字符串的replace方法一样,是用来替换字符串的,把匹配到的值替换成一个新的字符串,接受3个参数,第一个是正则表达式,第二个是要替换成什么,第三个就要查找的字符串,如果匹配不到的话,返回原来的字符串

    print(re.sub(r"good","bad",s))

    1. re.split
      split方法和字符串的split方法一样是用来分割字符的,按照匹配的字符串进行分割,返回一个list,如果匹配不到的话,那就返回list中的原来的字符串

    print(re.split(',',s))
    运行结果:['be is good is in is']

    常用的正则表达式符号

    1. 数量词
      '' 匹配前的字符0次或者多次,只是*前一个字符

    print(re.findall(r'be*','very ve v verrrrrr best b'))
    运行结果:['be', 'b']

    '+' 匹配前一个字符1次或者多次,只是+前面的一个字符

    print(re.findall(r'st+','be stt est is best'))
    运行结果:['stt', 'st', 'st']

    '?' 匹配前一个字符一次或者0次,只是?前面的一个字符

    print(re.findall(r'st?','be is best sttt'))
    运行结果:['s', 'st', 'st']

    '{m}' 匹配前一个字符m次

    print(re.findall(r't{2}er','be is bestt better better'))
    ['tter', 'tter']

    '{n,m}' 匹配前一个字符n到m次

    print(re.findall(r't{1,3}','sttestttt is best'))
    ['tt', 'ttt', 't', 't']

    一般字符

    '.' 默认匹配除 之外的任意一个字符

    print(re.findall(r'b.','be is good ba bg bf bt'))
    运行结果:['be', 'ba', 'bg', 'bf', 'bt']

    '' 转译符,前面的* + ?这样的字符都有特殊含义了,如果你想就想找它的话,那就得转译了
    意思就是说如果你想让特殊字符失去以前的含义,那么就得给它前面加上

    print(re.findall(r'?','besttest is best????'))
    运行结果:['?', '?', '?', '?']

    '|' 匹配|左或|右的字符

    print(re.findall(r'niuhanyang|best','niuhanyang is best'))
    ['niuhanyang', 'best']

    '[]' 字符集合,某些字符的集合,匹配的时候是这个集合里面的任意一个就行
    [A-z]大小写字母 [a-z]小写字母 [A-Z]大写字母 [0-9]所有的数字

    print(re.findall(r'be[stat]','niuhanyang is best '))
    运行结果:['bes']
    在[]里面如果用^ 的话代表取反,也就是不包括的这些字符串的

    print(re.findall(r'be[^stac]','niuhanyang is best bejson'))
    运行结果:['bej']

    .就是任意字符串
    .+出现一次或者多次的字符串
    .
    ?非贪婪模式

    边界匹配

    '^' 匹配以什么字符开头,多行情况下匹配每一行的开头
    print(re.findall(r'^ni','niuhan is good'))
    运行结果:['ni']
    print(re.findall(r'^b','niuhanyang is good best'))
    运行结果:['b']
    print(re.findall(r'^b','niuhanyang is good best',re.M))#多行模式
    运行结果:['b','b']
    '$' 匹配以什么字符结尾,多行情况下匹配每一行的结尾
    print(re.findall(r'd$','niuhanyang is good'))
    运行结果['d']
    priint(re.findall(r'd$','bestbest t is good best is good',re.M))#多行模式 >>>['d','d']
    A' 仅以什么字符开头,和^不同的是它不能用多行模式
    print(re.findall(r'Ayy','yy is good'))
    运行结果:['yy']
    '' 仅以什么字符结尾,和$不同的是它不能用多行模式
    print(re.findall(r'd','jjj is good'))
    运行结果:['d']

    预定义字符集合

    'd' 匹配数字0-9
    print(re.findall(r'd+','sdf2342312sdfs'))
    运行结果:['2342312']
    'D' 匹配非数字
    print(re.findall(r'D','sdf2342312sdfs'))
    运行结果:['sdf', 'sdfs']
    'w' 匹配[A-Za-z0-9],也就是所有的字母和数字和中文
    print(re.findall(r'w','sdf234%^2312sdfs&你好'))
    运行结果:['sdf234', '2312sdfs,'你好']
    'W' 匹配不是[A-Za-z0-9],也就是不是字母和数字
    print(re.findall(r'W','sdf234%^2312sdfs&'))
    运行结果:['%', '^', '&']
    's' 匹配空白字符、 、 、 ,空格
    print(re.findall('s','axss sdf '))
    运行结果:[' ', ' ', ' ', ' ', ' ']
    'S'匹配非空白字符,不是 、 、 ,空格
    print(re.findall('S','axss sdf '))
    运行结果:['a', 'x', 's', 's', 's', 'd', 'f']

    分组匹配

    '(...)' 分组匹配,把某些规则写成在一个组里,这样就可以直接对这个进行一些匹配了,举个例子的话,如果要匹配ip地址的话
    ip地址是类似这样的192.168.5.1,每一位都是1位或者3位的数字然后后面有个点正常写的话,得这么写
    print(re.findall(r'd{1,3}.d{1,3}.d{1,3}.d{1,3}',"192.168.1.3"))
    运行结果: ['192.168.1.3']
    这样写的话,有点麻烦了,通过上面的我们可以发现规律,除了第一个后面的全都是'.d{1,3}',写重复的代码就是低级的,这样的话就可以用分组了
    就把'.d{1,3}'当做一个整体,然后让他们出现3次就ok了,可以改成下面这样的
    print(re.search(r'd{1,3}(.d{1,3}){3}',"192.168.1.3").group())这个是用search方法的,结果和上面的一样的
    运行结果:192.168.1.3
    print(re.findall(r'd{1,3}(.d{1,3}){3}',"192.168.1.3"))咱们继续用findall方法,发现结果是下面的
    运行结果: ['.3']
    为啥会这样呢,用match方法和search方法都是正常的,findall方法这里有个坑,就是如果findall方法里面有分组的话,那结果就只是分组里面的内容
    ,如果想让结果正确的话就在分组最前面写上'?:',一个问号和一个冒号就好了,启用“不捕捉模式”
    print(re.findall(r'd{1,3}(?:.d{1,3}){3}',"192.168.1.3"))
    这么写结果就对了

    url = 'vi常用操作'
    url='

    使用Python生成双色球号码

    '
    print(re.findall(r'<h2>(.*)<p class="',url))

    正则表达式的匹配模式

    正则匹配模式是用在match/search/findall 里面的第三个参数,,这里只记了两种模式,还有其他模式但是一般用不到
    re.I 忽略大小写
    re.M多行模式,改变‘^’和‘s’的行为

  • 相关阅读:
    HDU 1800 Flying to the Mars 字典树,STL中的map ,哈希树
    字典树 HDU 1075 What Are You Talking About
    字典树 HDU 1251 统计难题
    最小生成树prim算法 POJ2031
    POJ 1287 Networking 最小生成树
    次小生成树 POJ 2728
    最短路N题Tram SPFA
    poj2236 并查集
    POJ 1611并查集
    Number Sequence
  • 原文地址:https://www.cnblogs.com/lingxia/p/7509875.html
Copyright © 2011-2022 走看看