正则表达式_笔记

from re import fullmatch, search, findall

正则表达式:r‘正则语法’

1、正则表达式

1)概念:

正则表达式是处理字符串的工具,通过不同的正则符号来描述字符串的规则

2)正则符号(语法)

=================匹配符号=================

a、普通字符:除了在正则中有特殊功能和特殊意义的符号以外的字符
    普通字符代表字符本身
b、字符 . ——匹配任意一个字符(一个点只能匹配一个字符)
c、 \w  ——匹配一个数字、字母、下划线(前提是在ASCII码表中)(供了解)
d、 \d ——匹配任意一个数字字符
e、 \s ——匹配任意一个空白字符(空格字符、换行字符、制表符...)
f、 \大写字母 ——匹配除了 \小写字母 外的任意字符
    \D ——匹配一个非数字字符
    \S ——匹配一个非空白字符
g、 [字符集] ——匹配字符集出现的任意一个字符(一个[]只能匹配一个字符)
    [1-9] ——匹配1到9中任意一个字符(字符编码递增)
    [a-z] ——匹配任意一个小写字母
    [a-zA-Z] ——匹配任意一个字母
    [a-zA-Z\d_] ——匹配任意一个字母数字下划线
    [ \t\n] ——匹配任意一个空白字符
    [\u4e00-\u9fa5] ——匹配任意一个中文字符
h、 [^字符集] ——匹配不在字符集中的任意一个字符
re_str = r'abc'  # 长度为3
print(fullmatch(re_str, 'abc'))  # 匹配成功
re_str = r'abc..123'  # 长度为8
print(fullmatch(re_str, 'abc+=123'))  # 匹配成功
re_str = r'\wabc'  # 长度为4
print(fullmatch(re_str, '_abc'))  # 匹配成功
re_str = r'\d\dabc'  # 长度为5
print(fullmatch(re_str, '32abc'))  # 匹配成功
re_str = r'\s...'  # 长度为4
print(fullmatch(re_str, ' ty5'))  # 匹配成功
re_str = r'[zzybrx]'  # 长度为1
print(fullmatch(re_str, 'b'))  # 匹配成功
re_str = r'[\u4e00-\u9fa5]'  # 长度为1
print(fullmatch(re_str, '钟'))  # 匹配成功

================检测符号==================
所有的检测符号都不会影响字符串的长度

a、 \b ——检测是否是单词边界
单词边界:能够将两个单词隔开并且不会产生歧义的任意符号
          ——空白字符、标点符号、-、字符串开头和字符串结尾
匹配规则:先去掉\b对字符串进行匹配,如果匹配成功再检查
          \b所在的位置是否是单词边界
b、 ^ ——检查 ^ 所在的位置是否是字符串开头([]外面)
c、 $ ——检查$所在位置是否是字符串结尾

print(fullmatch((r'abc,\b123'), 'abc,123'))  # 匹配成功
print(search(r'\b\d\d\b', 'jienv 45 swrr12rrfg'))  # 搜索成功
print(findall((r'\d\d\d'), '234erfgs4568ee905er'))  # ['234', '456', '905']

控制次数的符号(字符符号)

1、 * ——某个字符匹配0次或者多次
    123a* ——123后面a出现0次或者多次,123、123a、123aa
    123\d* ——123后面出现0个或者多个任意数字字符,123、1232、123456
2、 + ——某个字符匹配1次或者多次
3、 ?——某个字符匹配0次或者1次
4、 {}
    {N} ——某个字符匹配N次
    {M,N} ——某个字符匹配M到N此(至少M次,最多N次)
    {M,} ——某个字符匹配至少M次
    {,N} ——某个字符匹配最多N次

5、 贪婪和非贪婪

在匹配次数不确定的时候,会出现贪婪和非贪婪两种情况,默认情况都是贪婪
贪婪:在能够匹配成功的前提下,匹配次数尽可能多
非贪婪:在能够匹配成功的前提下,匹配次数尽可能少(在匹配次数后加?)

练习1:写一个正则表达式匹配一个字符:abc的前面是两个数字或者两个大写字母
======================分之==========================

正则1|正则2

——先让正则1去匹配,成则成,失败正则2去匹配(只要有一个匹配成功就好)

r‘\d\dabc|[a-z]{2}abc’

=======================分组=========================

1、() ——将括号里面的内容作为一个整体
a、整体操作
r'(\d\d|[a-z]{2})abc' ——匹配一个字符串后面是abc,前面是两个数字或者两个大写字母
r'([a-z]\d){3}' ——某一段字符串重复出现
b、分组操作
分组截取:r'(\d{3})([a-z]{3})' ——方便后面分段或者分情况取到不同的匹配结果(不影响匹配)
分组重复:r'(\d{3})[a-z]{3}\1' ——用\X来重复前面第X个分组匹配到的内容(\X前面必须有这个分组)

=====================转义符号======================

1、加 \

在正则中有特殊功能和特殊意义的符号前加 \ ,让这个符号的特殊功能和意义消失

2、加[]

在[]中有特殊意义的符号:a、^放在开头 b、-放在两个字符之间
其他符号包括:. + ? * $ ,这些单独的符号在[]中都是符号本身

print(fullmatch(r'\n\d{3}\+[a-z]{3}', '\n123+abc'))  # 匹配成功

re模块

——是Python提供的专门针对正则表达式应用的相关函数

from re import *
1、compile(正则表达式)——将正则表达式转换成正则对象
2、字符串匹配
fullmatch(正则表达式,字符串)——正则表达式与字符串完全匹配
match(正则表达式,字符串)——匹配字符串开头
——以上两个方法的结果:匹配失败是None,匹配成功返回匹配对象
3、查找
search(正则表达式,字符串)——在字符串中查找第一个满足正则的子串
        如果找到了结果是匹配对象,否则为None
findall(正则表达式,字符串)——获取字符串中所有满足正则表达式的子串,
        返回值是一个列表
        注意:如果正则中有分组,列表中的匹配结果只会取分组匹配到的内容
finditer(正则表达式,字符串)——获取字符串中所有满足正则的子串,
        返回值是一个迭代器,元素是匹配对象
result = finditer(r'(\d{3})([a-z]{2})', '是234hu士大夫345mmks89h=数348kl几十')
group = []
group1 = []
group2 = []
for x in result:
    group.append(x.group())
    group1.append(x.group(1))
    group2.append(x.group(2))
print(group)
print(group1)
print(group2)
4、切割
split(正则表达式,字符串)——将字符串中满足正则的子串作为切割点对字符串进行切割
        返回一个字符串列表
5、替换
sub(正则表达式,字符串1,字符串2)——将字符串2中所有满足正则的子串都替换成字符串1

补充:匹配对象

result = fullmatch(r'\d{3}=[a-z]{3}', '234=abc')
print(result)

1、获取匹配到的字符串

匹配对象.group()——获取整个正则表达式匹配到的字符串,结果是字符串
匹配对象.group(N)——获取整个正则表达式中第N个分组匹配到的字符串

2、获取匹配到的字符串在原字符串中的范围

匹配对象.span()——返回匹配结果在原字符串中的下标范围,[开始下标,结束下标)
匹配对象.span(N)——返回第N个分组匹配到的结果在原字符串中的范围

3、获取原字符串

匹配对象.string

print(result.group())
print(result.span())
print(result.string)
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。