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

    • 什么是正则表达式:

    正则表达式是一个特殊的字符序列,能帮助我们方便的检查一个字符串是否与某种模式匹配(定义往往都很枯燥) 

    也称之为”模式“,即可用于检查一个给定的字符串是否符合某种模式

     举例:

    我们定义一个模式,平常经常用到的日期模式:XXXX-XX-XX,2018-03-10

     在正则表达式的模式定义语法里:d用来指定一个数字,因此我们将日期的正则表达式的模式定义成:”dddd-dd-dd" 

    • 什么是元字符:

    元字符是一些在正则表达式中有特殊用途、不代表它本身字符意义的一组字符

     利用元字符,我们可以控制字符串匹配的方式

     比如上例中的d,用来指定一个数字,"相当于[0-9],匹配任何单个的数字字符",而非d字母本身

    • 元字符各自含义

       正则表达式的完整元字符及各自的含义(主要有11个): 

              .   ^   $  *  +  ?     |   { }    []    ()

    我们选挑重要的依次进行解释

    1.[ ] 方括号

    (1) 常用来指定一个字符集,如[abcd]匹配:a或b或c或d

    (2) 元字符在”[]”中不起所用,比如:[a+]匹配:a或+ 

    (3) 补集匹配:[^a],匹配非a的一个字符

    (4) 匹配连续字符:[a-zA-Z0-9],匹配大小写英文字母和数字

    2.^

    匹配行首,直接匹配字符串中的每一个换行

    3.$

    匹配行尾,行尾是指:字符串尾,或一个换行字符后的任何位置

    4.

    转义字符,如果要匹配””本身,需要使用再次转义:”\”

    一些特殊字符:

    d:匹配:[0-9]

    D:匹配:[^0-9],与 d 相反,匹配任何非十进制数字的字符

    s:匹配:任何空白符,即:[ fv]

    S:匹配:任何非空白符,即:[^ fv]

    w:匹配:[a-zA-Z0-9_ ],即匹配任何字符

    W:匹配:[^a-zA-Z0-9_ ],与w相反

    5. *

    匹配前一个字符或子表达式出现0次或多次

    例如:ca*t 将匹配 ct(0 个字符 a),cat(1 个字符 a),caaat(3 个字符 a)

    6. +

    匹配前一个字符或子表达式出现1次或多次

    例如: ca+t 会匹配 cat 和 caaat,但不会匹配 ct。

    7.?

    匹配前一个字符或子表达式出现1次或0次

    例如 :大?帅哥 可以匹配 大帅哥,也可以匹配 帅哥。

    8.{ }

    匹配前一个字符或子表达式出现指定次数(即代表重复)

    {0,}:0次或多次,相当于”*”

    {1,}:1次或多次,相当于”+”

    {0,1}:0次或1次,相当于”?”

    {m,n}:m次到n次(m <= n),m是最少重复的次数,n是最多重复的次数

    9.  .

    匹配除换行符以外的任意一个字符

    10. |   

    每一种条件匹配一次,且"|"和"[]"效果是相同的,返回形式一样

    例如:

    >>> print (re.findall(r"[abc]","abc"))

    ['a','b','c']

    >>> print (re.findall(r"[a|b|c]","abc"))

    ['a','b','c']

    11. ( )

    圆括号分组匹配使得匹配返回元组

    例如:

    >>> print (re.findall(r"one two three four five six",a))

    ['one two three four five six']

    >>> print (re.findall(r"(one) (two) (three) (four) (five) (six)",a))

    [ ]返回空

    • python语言中的re模块

    在python语言中,re模块用于提供正则表达式的全部功能,而re模块中最重要的两个函数是match()和re.search()

    re.match()简介

    格式:re.match(pattern,string,flag=0),

    第一个参数pattern用于传入需要匹配的模式定义字符串

    第二个参数string用于传入被匹配和检查的字符串内容

    第三个flag用于传入标识,如是否区分大小写

    例1:

    import re

    print(re.match("dddd-dd-dd","2018-03-09"))

    运行结果:<_sre.SRE_Match object; span=(0, 10), match='2018-03-09'>

    代表2018-03-09符合我们定义的日期模式

    例2:

    import re

    print(re.match("dddd-dd-dd","2018-3-9"))

    运行结果:NONE

    代表不符合

    思考一下,如何既满足符合一个数字的月份和日又符合两个数字的月份和日(见例3)

    例3:

    import re

    print(re.match("dddd-d{1,2}-d{1,2}","2018-3-9")) 

    如果看不懂,请返回到上节8.{}介绍部分

     例4:

    再思考一下,下面的代码

    import re

    print(re.match("d{4}-d{1,2}-d{1,2}","2018-3-9"))

    例5:

    思考一下,下面的代码(可先看一下上一节s和*的含义)

    imprt re

    print(re.match("s*d{4}-d{1,2}-d{1,2}","   2017-05-08")

     代码是为了兼容日期前面如果出现多个空格的情况使用 s*

    例6:

    import re

    print(re.match("Dehom","Dehom Wang"))

     回归最简单模式就是字符串本身,这很重要

    补充知识:

    Python中字符串前面加上 r 表示原生字符串,(r=raw)

    Python里的原生字符串很好地解决了需要转义字符这个问题,例如匹配一个数字的"\d"可以写成r"d"。有了原生字符串,不用担心是不是漏写了反斜杠,写出来的表达式也更直观

  • 相关阅读:
    机试笔记1
    ZOJ 3846 GCD Reduce//水啊水啊水啊水
    最短路练习
    CodeForces 632C The Smallest String Concatenation//用string和sort就好了&&string的基础用法
    HDOJ 5667 Sequence//费马小定理 矩阵快速幂
    HDOJ 5666//快速积,推公式
    HDOJ 5672//模拟
    网络流相关知识点以及题目//POJ1273 POJ 3436 POJ2112 POJ 1149
    南理第八届校赛同步赛-C count_prime//容斥原理
    python之shutil模块使用方法
  • 原文地址:https://www.cnblogs.com/lily1989/p/8555757.html
Copyright © 2011-2022 走看看