• re模块(正则表达式)


    一、什么是正则表达式

    正则就是用一些具有特殊含义的符号组合到一起(称为正则表达式)来描述字符或者字符串的方法。或者说:正则就是用来描述一类事物的规则。(在Python中)它内嵌在Python中,并通过 re 模块实现。正则表达式模式被编译成一系列的字节码,然后由用 C 编写的匹配引擎执行。

    二、正则表达式基础

    字符组 : [字符组]

    在同一个位置可能出现的各种字符组成了一个字符组,在正则表达式中用[]表示 字符分为很多类,比如数字、字母、标点等等。

    1 [1]                       匹配1
    2 [123]        匹配1、2、3
    3 [0-9]       匹配任意一个数字
    4 [a-z]       匹配任意一个小写字母
    5 [A-Z]       匹配任意一个大写字母
    6 [A-Za-z]      匹配任意一个字母

    示例如下:

    1 print(re.findall('[1]','Zll5201314'))       #['1', '1']
    2 print(re.findall('[123]','Zll5201314'))     #['2', '1', '3', '1']
    3 print(re.findall('[0-9]','Zll5201314'))     #['5', '2', '0', '1', '3', '1', '4']
    4 print(re.findall('[a-z]','Zll5201314'))     #['l', 'l']
    5 print(re.findall('[A-Z]','Zll5201314'))     #['Z']
    6 print(re.findall('[a-zA-Z]','Zll5201314'))  #['Z', 'l', 'l']
    7 print(re.findall('[A-Za-z0-3]','Zll5201314')) #['Z', 'l', 'l', '2', '0', '1', '3', '1']

    元字符:

     1 .    匹配除换行符以外的任意字符
     2 w    匹配字母或者数字或者下划线
     3 s     匹配任意空白字符
     4 d     匹配数字
     5 
         匹配换行符
     6 	    匹配制表符tab
     7     匹配一个单词的结尾
     8 ^    匹配字符串的开始
     9 $    匹配字符串的结尾
    10 W   匹配非字母或下划线或数字
    11 D   匹配非数字
    12 S   匹配非空白符
    13 |    匹配|前或者后的内容
    14 ()    匹配括号内的表达式,也表示一个组

    示例如下:

     1 print(re.findall('.','love_u 520')) #['l', 'o', 'v', 'e', '_', 'u', ' ', '5', '2', '0']
     2 print(re.findall('w','love_u 520')) #['l', 'o', 'v', 'e', '_', 'u', '5', '2', '0']
     3 print(re.findall('s','love_u 520')) #[' ']
     4 print(re.findall('d','love_u 520')) #['5', '2', '0']
     5 print(re.findall('
    ','love_u 520')) #[]
     6 print(re.findall('','love_u 520')) #[]
     7 print(re.findall('^l','love_u 520')) #['l']
     8 print(re.findall('520$','love_u 520'))#['520']
     9 print(re.findall('W','love_u 520')) #[' ']
    10 print(re.findall('D','love_u 520')) #['l', 'o', 'v', 'e', '_', 'u', ' ']
    11 print(re.findall('S','love_u 520')) #['l', 'o', 'v', 'e', '_', 'u', '5', '2', '0']
    12 print(re.findall('love|u','love_u 520')) #['love', 'u']

    量词:

    1 *   重复零次或者多次 
    2 +  重复1次或者多次
    3 ?  重复零次或者一次
    4 {n}  重复n次
    5 {n,}  重复n次或者更多次
    6 {n,m}  重复n到m次

    示例如下:

    1 print(re.findall('5*','555 5')) #['555', '', '5', '']
    2 print(re.findall('5+','555 5')) #['555', '5']
    3 print(re.findall('5?','555 5')) #['5', '5', '5', '', '5', '']
    4 print(re.findall('5{2,3}','555 5')) #['555']
    5 print(re.findall('5{2}','555 5')) #['55']
    6 print(re.findall('5{3}','555 5')) #['555']

    三、常见的正则表达式应用

    1 手机号(国内):^[1-9][3478]d{9}
    2 电话号(国内):[0-9-()()]{7,18}
    3 邮编:d{6}
    4 QQ:[1-9]([0-9]{5,11})
    5 身份证号:d{17}[d|x]|d{15}
    6 邮箱:w[-w.+]*@([A-Za-z0-9][-A-Za-z0-9]+.)+[A-Za-z]{2,14}
    7 网址:^((https|http|ftp|rtsp|mms)?://)[^s]+
    8 日期:d{4}(-|/|.)d{1,2}1d{1,2}
    9 用户名:[A-Za-z0-9_-u4e00-u9fa5]+

    #正则表达式在线测试网址“http://tool.chinaz.com/regex/”

    四、python中如何使用正则表达式

    findall()方法:

    此方法是在整个字符串中匹配指定字符或者字符串,并且将所有满足条件的结果返回到一个列表中,如下:

    1 ret = re.findall('a','abac')
    2 print(ret)  #['a', 'a']
    3 ret = re.findall('ab','abac') 4 print(ret)  #['ab']

    search()方法:

    此方法是在整个字符串中查找满足匹配条件的字符或者字符串,一旦找到一个就不再继续查找,并返回包含查找值的对象,可以用.group()方法进行查看,如下:

    1 ret = re.search('a','abac')
    2 print(ret.group())  #a

    match()方法:

    此方法是用来从开头位置查找是否满足匹配条件,如果没有就会返回None,如果有,则会返回一个包含查找值的对象,可以用group()方法进行查看,如下:

    1 ret = re.match('a','abac')
    2 print(ret.group())  #a
    3 
    4 ret = re.match('b','abac')
    5 print(ret)  #None

    split()方法:

    此方法用来对一个字符串进行切分,如下:

    1 ret = re.split('[ab]', 'abcd')  # 先按'a'分割得到''和'bcd',在对''和'bcd'分别按'b'分割
    2 print(ret)  # ['', '', 'cd']

    sub()以及subn()方法:

    1 ret = re.sub('d', '*', 'a1b2c3')#将数字替换成'*',默认替换所有的数字
    2 print(ret) #a*b*c*
    3 
    4 ret = re.sub('d', '*', 'a1b2c3', 1)#将数字替换成'*',参数1表示只替换1个
    5 print(ret) #a*b2c3
    6 
    7 ret = re.subn('d', '*', 'a1b2c3')#将数字替换成'*',返回一个元祖(替换后的字符串,替换的次数)
    8 print(ret) #('a*b*c*', 3)

    compile()方法:

    此方法是先把正则表达式编译好,以方便多次使用,如下:

    1 obj = re.compile('d{3}')  #将正则表达式编译成为一个 正则表达式对象,规则要匹配的是3个数字
    2 ret = obj.search('abc123eeee') #正则表达式对象调用search,参数为待匹配的字符串
    3 print(ret.group())  #结果 : 123
    finditer()方法:
    此方法与findall类似,只不过返回的不是一个列表,而是一个生产器,可以用next(iter).group()来查看里面的值,如下:
    1 ret = re.finditer('d', 'ds3sy4784a')   #finditer返回一个存放匹配结果的迭代器
    2 print(ret)  # <callable_iterator object at 0x10195f940>
    3 print(next(ret).group())  #查看第一个结果
    4 print(next(ret).group())  #查看第二个结果
    5 print([i.group() for i in ret])  #查看剩余的左右结果
     
  • 相关阅读:
    构建一个应用,并在docker compose里运行起来
    docker engine docker-compose部署
    django 返回数据的几种常用姿势
    fiddler+httprunner 零编码实现接口自动化DEMO
    选择排序
    曾经学的那些表示时间复杂度的公式怎么来的?
    python+Airtest+android使用AirtestIDE编写一个DEMO
    怎么计算时间复杂度?
    算法_冒泡排序python+java实现
    2020年1月16日(多进程)
  • 原文地址:https://www.cnblogs.com/fu-yong/p/8253659.html
Copyright © 2020-2023  润新知