Python语言基础之数据类型-正则表达式(3-2)

1、正则表达式
正则表达式又称规则表达式(Regular Expression),是使用单个字符串来描述、匹配某个句法规则的字符串,常被用来检索、替换那些符合某个规则的文本。一个正则表达式通常称为一个模式(Pattern)。例如,Polish/Spanish/Swedish这三个字符串,都可以由(Pol/Span/Swed)ish这个模式来描述。大部分的正则表达式的形式都有以下结构:

1)、选择
竖线 “|” 表示选择,具有最低优先级,例如:center|centre 可以匹配 center 或 centre。

2)、数量限定
字符后数量限定符用来限定前面这个字符允许出现的个数最常见的数量限定符包括 “ + ” 、“ * ” 、和 “ ? ”

3)、匹配
成对的圆括号 “()” 用来定义操作符的范围和优先级,例如:gr(a|e)y等价于 gray|grey , (grand)?father 匹配 father 和 grandfather 。
正则表达式中除上述几个字符外,还使用了一些特殊的方式表示匹配的模式,常用的特殊字符及含义如下所示:
在这里插入图片描述
在这里插入图片描述注:上表中 \w 中描述部分有误,正确描述如下所示:在这里插入图片描述

常用特殊字符的优先级,如下所示:
在这里插入图片描述
**python中可以通过 re 模块使用正则表达式。**常用的方法如下表所示:
在这里插入图片描述

2、re.match函数

re.match(pattern, string, flags=0)
pattern:正则表达式
string:要匹配的字符串
flags:标志位,用来控制正则表达式的匹配方式,如是否区分大小写、多行匹配等。

正则表达式可包含一些可选标志修饰符来控制匹配的pattern修饰符被指定为一个可选的标志,多个标志符可以通过按位 OR(|) 来指定。例如:re.M|re.I 被设置成 M 和 I 标志。修饰符说明如下:
在这里插入图片描述
re.match 尝试从字符串的起始位置匹配一个pattern ,如果不是起始位置匹配成功的话,match() 就返回一个none.
如果匹配成功,re.match方法返回一个匹配的对象,否则返回none,如下:

  # 通过span()可以获取匹配的位置。
    lin = 'This is a very cute kitten'
    print(re.match('This', lin))    # <re.Match object; span=(0, 4), match='This'>
    print(re.match('This', lin).span())     # (0, 4)
    print(re.match('cute',lin))      # None , match是从起始位置开始匹配的,匹配不上就返回None

    stt = 'kitten is a cute girl'
    print(re.match('kitten', stt).span())   # (0, 6)
    print(re.match('Kitten', stt, re.I).span())    # (0, 6)    re.I 修饰符使得匹配对大小写不敏感

可以 使用group(num) 或 group() 匹配对象函数来获取匹配表达式。
正则表达式中捕获分组的序号(一对括号为一个组),取值范围是1~n(n为捕获分组个数,空表示捕获整个匹配上的字符串)。
在这里插入图片描述
示例一:

    stt1 = 'kiter is a cute kiter'
  # matObj = re.search(r'(.+) is (.*) (.*) .+', stt1, re.M|re.I)
    matObj = re.search(r'(.+) is (.*) (.*?) .+', stt1, re.M|re.I)
    if matObj:
        print("matObj.group() : "+matObj.group())
        print("matObj.group(1) : "+matObj.group(1))
        print("matObj.group(2) : "+matObj.group(2))
        print("matObj.group(3) : "+matObj.group(3))
    else:
        print("No match!!")
   
   结果:
   matObj.group() : kiter is a cute kiter
   matObj.group(1) : kiter
   matObj.group(2) : a
   matObj.group(3) : cute

示例二:
在正则表达式中使用 “ * ” 匹配字符串默认是匹配到字符串的结尾,即“贪婪模式”。如果只想匹配到第一个符合条件的子字符串就停止,则需要切换为 “非贪婪模式” ,方法是在 “ * ” 后面加上 “ ? ” ,如下所示:

    stt1 = 'kiter is a cute kiter'
    matObj = re.search(r'(.+) is (.*) .+', stt1, re.M|re.I)       # 贪婪模式
    matObj = re.search(r'(.+) is (.*?) .+', stt1, re.M|re.I)       # 非贪婪模式
    if matObj:
        print("matObj.group() : "+matObj.group())
        print("matObj.group(1) : "+matObj.group(1))
        print("matObj.group(2) : "+matObj.group(2))
    else:
        print("No match!!")
    结果如下:
   matObj.group() : kiter is a cute kiter
   matObj.group(1) : kiter
   matObj.group(2) : a cute        # 贪婪模式结果
   matObj.group(2) : a               # 非贪婪模式结果
    stt2 = '<span>abd</span><span>abb</span>'
#   mch = re.match(r'<span>.*</span>', stt2, re.I|re.M)     # 贪婪模式
    mch = re.match(r'<span>.*?</span>', stt2, re.I|re.M)     # 非贪婪模式
    if mch:
        print('mch.group():' + mch.group())
    else:
        print('not match!')
    结果:
    mch.group():<span>abd</span><span>abb</span>    # 贪婪模式结果
    mch.group():<span>abd</span>      # 非贪婪模式结果

以上可见,“贪婪模式” 在正则表达式匹配成功的前提下,尽可能多地匹配;而 “非贪婪模式” 在正则表达式匹配成功的前提下,尽可能的少匹配。两种模式影响的是被量词修饰的子表达式的匹配行为。

3、re.search方法
扫描整个字符串,并返回第一个成功的匹配

    stTes = 'industre and industy'
    pattern = 'industr{1,}'
    p = re.compile(pattern)
    match = re.search(p,stTes)
    print(match.group(0))   # industr

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值