python3 re模块的使用

138 阅读3分钟

正则表达式模式

字符

元字符匹配内容
.匹配除换行符以外的所有字符
\w匹配数字字母或下划线
\W匹配非数字字母或下划线
\s匹配任意空白符
\S匹配非空白符
\d匹配数字
\D匹配非数字
匹配字符串的开始
$匹配字符串的结尾
ab匹配字符a或者字符b
()匹配括号内的表达式,也表示组
[...]匹配字符组中的字符
[^...]匹配除字符组中的所有字符
\数字匹配第几个分组

量词

量词说明
*重复零次或多次
+重复一次或多次
?重复零次或一次
{n}重复n次
{n,}重复n次或更多次
{n,m}重复n次到m次

修饰符

修饰符描述
re.I使匹配对大小写不敏感
re.L做本地化识别匹配
re.M多行匹配,影响^和$
re.S使.匹配包括换行在内的所有字符
re.U根据Unicode字符集解析字符。这个标志影响 \w, \W, \b, \B.
re.X该标志通过给予你更灵活的格式以便你将正则表达式写得更易于理解

使用示例:

import re
from loguru import logger


def re_match_and_search(pattern, data_str):
    """match 和 search"""

    # <re.Match object; span=(5, 6), match='3'>
    match_res = pattern.match(data_str, 5, 12)
    logger.info(f"match_res = {match_res} | type = {type(match_res)}")
    logger.info(f"match_res.group() = {match_res.group()}")

    # <re.Match object; span=(9, 10), match='4'>
    search_res = pattern.search(data_str, 6, 12)
    logger.info(f"search_res = {search_res} | type = {type(search_res)}")
    search_res.group()
    logger.info(f"search_res.group() = {search_res.group()}")


if __name__ == "__main__":
    pass
    # pattern = re.compile(r'\d')
    # data_str = 'ABC123def456'
    # #           01234567890
    # re_match_and_search(pattern, data_str)

    # re模块函数一般使用方式re.func_name(pattern, string,
    # flags=0),flags为标志位,控制正则表达式的匹配方式,比如不区分大小写,多行匹配等。

    match_str_data = 'www.google.com/www.google.com/www.google.com'

    # 1、re.match(pattern, string, flags=0)
    # 函数,尝试从字符串起始位置匹配一个模式,匹配成功返回一个re.Match实例,起始位置没有匹配到或没有匹配到,返回None
    logger.info(re.match('www', match_str_data).group())
    # 输出:www
    logger.info(re.match('www', match_str_data).span())
    # 输出:(0, 3)
    logger.info(re.match('com', match_str_data))
    # 输出:None

    # 2、re.search(pattern, string, flags=0) 函数,扫描整个字符串并返回第一个成功的匹配
    search_str_data = 'google.com/www.google.com/www.google.com'
    logger.info(re.search('www', search_str_data).group())
    # 输出:<re.Match object; span=(0, 3), match='www'>
    logger.info(re.search('www', search_str_data).span())
    # 输出:(0, 3)

    # 3、re.sub(pattern, repl, string, count=0, flags=0)函数,用于替换字符串中的匹配项
    """
    语法:re.sub(pattern, repl, string, count=0, flags=0)
    参数:
    pattern : 正则中的模式字符串。
    repl : 替换的字符串,也可为一个函数。
    string : 要被查找替换的原始字符串。
    count : 模式匹配后替换的最大次数,默认 0 表示替换所有的匹配。
    flags : 编译时用的匹配模式,数字形式。
    前三个为必选参数
    """
    logger.info(re.sub(r'\D', '', '133-1234-1234', 0))
    # 输出:13312341234
    logger.info(re.sub(r'\D', '', '133-1234-1234', 1))
    # 输出:1331234-1234

    # 4、re.findall(string[, pos[, endpos]])
    # 函数,在字符串中查找RE匹配到的所有字符串,返回一个列表,如果没有匹配到返回一个空列表
    logger.info(re.findall(r'\d+', 'ABC123def456'))
    # 输出:['123', '456']
    pattern = re.compile(r'\d+')
    logger.info(pattern.findall('ABC123def456', 5, 12))
    # 输出:['3', '456']
    logger.info(re.findall(r'www.(baidu|google).com', 'www.google.com'))
    # 输出:['google']
    logger.info(re.findall(r'www.(?:baidu|google).com', 'www.google.com'))
    # 输出:['www.google.com']

    # 5、re.finditer(pattern, string, flags=0)
    # 函数,和findall类似,查找字符串中所有和RE匹配的字符串,将结果作为一个迭代器返回
    pattern = re.compile(r'\d+')
    for i in pattern.finditer('ABC123def456', 5, 12):
        logger.info(i)
    # 输出:<re.Match object; span=(5, 6), match='3'>
    # 输出:<re.Match object; span=(9, 12), match='456'>

    # 6、re.split(pattern, string[, maxsplit=0, flags=0]) 函数,按匹配到的字符串将字符串分割,返回列表
    logger.info(re.split('[;,:]', 'A;B,C'))
    # 输出:['A', 'B', 'C']
    logger.info(re.split('[;,:]', 'A;B,C', 1))
    # 输出:['A', 'B,C']
    logger.info(re.split(r'([;,])', 'A;B,C'))  # 在匹配模式上加()可以保留匹配的项
    # 输出:['A', ';', 'B', ',', 'C']
    logger.info(re.split(r'\W', 'life is\tshort\nyou\rneed\fpython'))
    # 输出:['life', 'is', 'short', 'you', 'need', 'python']