正则表达式Re库介绍

Re库是python的标准库,Re库采用raw string(原生字符串类型)表示正则表达式,如 r’[1-9]\d{5}’。

调用方法 :

import re

使用原生字符串(即不包含转义符的字符串)类型表示正则表达式会更方便。python有一个转义斜杠’’,在原生字符串中斜杠’'不会被解释成转义符。正则表达式也可以用String类型来表示,但是很繁琐。

电话号码的两种正则表达式写法比较:
raw string原生字符串:r’\d{3}-\d{8}|\d{4}-\d{8}’
String字符串类型:’\\d{3}-\\d{8}|\\d{4}-\\d{8}’
字符串类型中对斜杠‘'进行了转义,为了避免斜杠被转义,我们需要用一个斜杠来转义它,这样子后,原来是杠的,变成杠杠。相比之下,原生字符串就显得方便多了。

Re库主要功能函数

函数 说明
re.search() 返回match对象,在一个字符串搜索匹配正则表达式的第一个位置
re.match() 返回match对象,从一个字符串的开始位置起匹配正则表达式
re.findall() 搜索字符串,以列表类型返回全部能匹配的子串
re.split() 将一个字符串按照正则表达式匹配结果进行分割,返回列表类型
re.finditer() 搜索字符串,返回一个匹配结果的迭代类型,每个迭代元素是match对象
re.sub() 在一个字符串中替换所有匹配正则表达式的子串,返回替换后的字符串

示例代码:

import re


if __name__ == "__main__":
    # search(pattern, string, flags=0)
    # pattern正则表达式,可以是原生字符串类型(前面放个小r),也可以是字符串类型的正则表达式
    # string 待匹配的内容
    # flag是控制标记,有三种:
    # re.I 或 re.IGNORECASE,忽略正则表达式的大小写,[A-Z]也能够匹配小写字符
    # re.M 或 re.MULTILINE ,作用在正则表达式中的^操作符,能够将给定的字符串的每行当作匹配的开始
    # re.S 或 re.DOTALL,作用在正则表达式中的.操作符,能够匹配所有字符,默认匹配除换行外的所有字符。
    match = re.search(r'[1-9]\d{5}', 'China 102256', re.I)
    # 一定要加if判断
    if match:
        print(match.group(0))
    # 从一个字符串的开始位置起匹配正则表达式
    m_match = re.match(r'[1-9]\d{5}', '100002BiT')
    if m_match:
        print(m_match.group(0))
    # 返回列表
    list = re.findall(r'[1-9]\d{5}', 'BIT100005 188898TTu')
    print(list)
    # split(pattern, string, maxsplit=0, flags=0)
    # pattern正则表达式,可以是原生字符串类型(前面放个小r),也可以是字符串类型的正则表达式
    # string 待匹配的内容
    # maxsplit最大分割数,剩余部分将作为最后一个元素输出
    # flag是控制标记,有三种:
    # re.I 或 re.IGNORECASE,忽略正则表达式的大小写,[A-Z]也能够匹配小写字符
    # re.M 或 re.MULTILINE ,作用在正则表达式中的^操作符,能够将给定的字符串的每行当作匹配的开始
    # re.S 或 re.DOTALL,作用在正则表达式中的.操作符,能够匹配所有字符,默认匹配除换行外的所有字符。
    split = re.split(r'[1-9]\d{5}', 'BIT100005 188898TTu', maxsplit=1)
    print(split)
    # 返回一个匹配结果的迭代类型
    for m in re.finditer(r'[1-9]\d{5}', 'BIT100005 188898TTu'):
        if m:
            print(m.group(0))
    # sub(pattern, repl, string, count=0, flags=0):
    # pattern正则表达式,可以是原生字符串类型(前面放个小r),也可以是字符串类型的正则表达式
    # repl 替换匹配字符串的字符串
    # string 待匹配的字符串
    # count匹配替换的最大次数
    # flags控制标记,作用同上
    sub = re.sub(r'[1-9]\d{5}', 'HelloWorld', 'BIT100005 188898TTu')
    print(sub)
    # 以下都是函数式的用法适合一次性操作,还有另外一种面向对象用法,编译后可以多次操作
    # compile可以将正则表达式编译成一个对象
    pat = re.compile(r'[1-9]\d{5}')
    rst = pat.search("BIT 899990")
    print(rst.group(0))

Match对象的属性

属性 说明
.string 待匹配文本
.re 匹配时使用的pattern对象(正则表达式)
.pos 正则表达式搜索文本的开始位置
.endpos 正则表达式搜索文本的结束位置

Match对象的四个常用方法

方法 说明
.group(0) 获得匹配后的字符串
.start() 匹配字符串在原始字符串中的开始位置
.edn() 匹配字符串在原始字符串中的结束位置
.span() 返回(.start(),.end())

示例代码:

import re


if __name__ == "__main__":
    match = re.search(r'[1-9]\d{5}', 'BIT100005 188898TTu')
    print(match.string)
    print(match.re)
    print(match.pos)
    print(match.endpos)

    print(match.group(0))
    print(match.start())
    print(match.end())
    print(match.span())

Re默认采用贪婪匹配,就是返回最长匹配。如果要获得最短匹配,要使用以下最小匹配操作符:

操作符 说明
*? 前一个字符0次或无限次扩展,最小匹配
+? 前一个字符1次或无限次扩展,最小匹配
?? 前一个字符0次或1次扩展,最小匹配
{m,n}? 扩展前一个字符m至n次(含n),最小匹配

当有操作符可以匹配不同长度的时候,可以在这个操作符后面加?,获得最小匹配。

谢谢阅读

你可能感兴趣的:(python,Re,正则表达式)