栏目分类:
子分类:
返回
文库吧用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
文库吧 > IT > 软件开发 > 后端开发 > Python

# 正则表达式

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

# 正则表达式

# 正则表达式 1. 什么是正则表达式

​ 正则表达式是一种可以让复杂的字符串问题变得简单的工具。

​ 正则并不是Python特有语法(不属于Python),所有的高级编程语言都支持正在,正在的语法通用。

​ 不管通过正则表达式解决的时候什么问题,写正则的时候都是在使用正则表达式描述字符串规则。

2. Python的re模块

​ re模块是Python用来支持正则表达式的一个模块,模块中包含了所有和正则相关的函数。

​ fullmatch (正则表达式, 字符串) - 判断正则表达式和指定的字符串是否完全匹配(判断整个字符

​ 串是否符合正则表达式所描述的规则),如果匹配成功返回匹配对象,匹配失败返回None

  from re import fullmatch
3.正则语法 匹配类符号
# 1)普通符号  -  在正则表达式中表示符号本身的符号
result = fullmatch(r'abc', 'abc')
print(result)

# 2).   -   匹配任意一个字符
result = fullmatch(r'a.c', 'a.c')
print(result)

result = fullmatch(r'..abc', '*9abc')
print(result)

# 3)d  -  匹配任意一个数字字符
result = fullmatch(r'adc', 'a5c')
print(result)

# 4)s  -   匹配任意一个空白字符
空白字符  -   能产生空白效果的字符,例如:空格、换行、水平制表符
result = fullmatch(r'asc', 'atc')
print(result)

result = fullmatch(r'dds.ab', '34 吗ab')
print(result)

# 5)D  -   匹配任意一个非数字字符
result = fullmatch(r'aDc', 'a*c')
print(result)

# 6)S  -   匹配任意一个非空白字符
result = fullmatch(r'aSc', 'a c')
print(result)       # None

result = fullmatch(r'aSc', 'a1c')
print(result)

# 7)[字符集]       -      匹配字符集中的任意一个字符
"""
[abc]       -       匹配a或者b或者c
[abcd]     -       匹配a或者b或者c或者任意数字
[1-9]       -       匹配1到9中的任意一个数字
[a-z]       -       匹配任意一个小写字母
[A-Z]       -       匹配任意一个大写字母
[a-zA-Z]    -       匹配任意一个字母
[a-zA-Zd_]     -   匹配字母数字或者下划线
[u4e00-u9fa5]     -   匹配任意一个中文字符

注意:[]中减号放在两个字符之间表示谁到谁(确定的方式是根据字符编码值大小确定的);  如果减号不在两个字符之间,就表示一个普通的减号
"""
result = fullmatch(r'a[MN12]b', 'aNb')
print(result)

result = fullmatch(r'a[MNd]b', 'a4b')
print(result)

# 8)[^字符集]      -   匹配不在字符集中的任意一个字符
result = fullmatch(r'a[^MN]b', 'a是b')
print(result)

result = fullmatch(r'a[^u4e00-u9fa5]b', 'a-b')
print(result)
次数
# 1. *      -   0次或多次(任意次数)
# 注意:*在谁的后面控制的就是谁的次数
"""
a*      -       0个或多个a
d*     -       0个或者多个d

"""
result = fullmatch(r'a*123', 'aaaaaaaa123')
print(result)

result = fullmatch(r'd*abc', '123411232abc')
print(result)

result = fullmatch(r'[MN]*abc', 'MNMabc')
print(result)


# 2. +      -   1次或者多次(至少一次)
result = fullmatch(r'a+123', 'aaaaa123')
print(result)

# 3. ?      -   0次或1次
result = fullmatch(r'A?123', 'A123')
print(result)

# 4. {}
"""
{M,N}   -   M到N次
{M,}    -   至少M次
{,N}    -   最多N次
{N}     -   N次
"""

result = fullmatch(r'[a-z]{3,5}123', 'bambk123')
print(result)


# 练习:写一个正则,判断输入的内容是否是一个合法的QQ号(长度是5~12位的数字,第一位不能是0)
qq = '3452'
result = fullmatch(r'[1-9]d{4,11}', qq)
if result:
    print(f'{qq} 合法')
else:
    print(f'{qq} 不合法')


# 练习:判断输入的内容是否是一个合法的标识符(由字母、数字下划线组成,数字不能开头)
str1 = 'abc'
result = fullmatch(r'[a-zA-Z_][da-zA-Z_]*', str1)
print(result)

match(正则表达式, 字符串) - 判断字符串开头是否符合正则表达式描述的规则

from re import match


result = match(r'd{3}', '234宿舍wsww')
print(result)
贪婪和非贪婪
from re import match
"""
当匹配次数不确定的时候(*、+、?、{M,N}、{M,}、{,N}),匹配模式分为贪婪和非贪婪两种,默认是贪婪的。

贪婪和非贪婪:在匹配成功的时候有多种匹配结果,贪婪去最多次数对应的匹配结果, 非贪婪取最少次数对应的匹配结果
            (匹配次数不确定的地方,有多种匹配方式都可以匹配成功,贪婪取最多次数, 非贪婪取最少次数)
            
贪婪模式:*、+、?、{M,N}、{M,}、{,N}
非贪婪模式:*?、+?、??、{M,N}?、{M,}?、{,N}?
"""

# amb、amb计算b、amb计算bxxb
# 1)示例1:
# 贪婪模式
result = match(r'a.+b', 'amb计算bxxbmn')
print(result)           # 

# 非贪婪模式
result = match(r'a.+?b', 'amb计算bxxbmn')
print(result)           # 


# 注意:如果匹配结果只有一种可能,那么贪婪和非贪婪的结果一样
result = match(r'a.+b', 'ambxx')
print(result)           #  

result = match(r'a.+?b', 'ambxx')
print(result)           # 

from re import match

# match(正则表达式, 字符串)  - 判断字符串开头是否符合正则表达式描述的规则
result = match(r'd{3}', '234宿舍wsww')
print(result)

# 1. 贪婪和非贪婪
"""
当匹配次数不确定的时候(*、+、?、{M,N}、{M,}、{,N}),匹配模式分为贪婪和非贪婪两种,默认是贪婪的。

贪婪和非贪婪:在匹配成功的时候有多种匹配结果,贪婪去最多次数对应的匹配结果, 非贪婪取最少次数对应的匹配结果
            (匹配次数不确定的地方,有多种匹配方式都可以匹配成功,贪婪取最多次数, 非贪婪取最少次数)
            
贪婪模式:*、+、?、{M,N}、{M,}、{,N}
非贪婪模式:*?、+?、??、{M,N}?、{M,}?、{,N}?
"""

# amb、amb计算b、amb计算bxxb
# 1)示例1:
# 贪婪模式
result = match(r'a.+b', 'amb计算bxxbmn')
print(result)           # 

# 非贪婪模式
result = match(r'a.+?b', 'amb计算bxxbmn')
print(result)           # 


# 注意:如果匹配结果只有一种可能,那么贪婪和非贪婪的结果一样
result = match(r'a.+b', 'ambxx')
print(result)           #  

result = match(r'a.+?b', 'ambxx')
print(result)           # 

转义字符
from re import fullmatch

# 1. 转义符号
# 正则中的转义符号,就是在本身具备特殊功能或者特殊意义的符号前加'',让这个符号变成一个普通符号。

# 匹配任意一个小数对应的字符串
result = fullmatch(r'd+.d+', '23.879')
print(result)

# +234、+889111
result = fullmatch(r'+d+', '+23')
print(result)

# (mv)、(ksma)
result = fullmatch(r'([a-z]+)', '(msnd)')
print(result)


# 2. []里面的转义符号
# 单独存在有特殊意义的符号(+、*、?、.等),在[]中特殊意义会自动消失
result = fullmatch(r'd+[.+*?]d+', '23?879')
print(result)


# 本身在中括号中有特殊功能的符号,如果要表示普通符合必须加''
result = fullmatch(r'a[MN-]b', 'a-b')
print(result)

result = fullmatch(r'a[M-N]b', 'a-b')
print(result)

result = fullmatch(r'a[MN^]b', 'a^b')
print(result)

result = fullmatch(r'a[^MN]b', 'a^b')
print(result)

检测类
from re import fullmatch, findall

# 检测类符号是在匹配成功的情况下,检测检测类符号所在的位置是否符号相关要求

# 1.b  -   检测是否是单词边界
# 单词边界:可以将两个单词区分开的符号都是单词边界,比如:空白符号、英文标点符号、字符串开头和字符串结尾
result = fullmatch(r'abcb mn', 'abc mn')
print(result)


message = '203mn45,89 司机34kn;23;99mll==910,230 90='
result = findall(r'd+', message)
print(result)       # ['203', '45', '89', '34', '23', '99', '910', '230', '90']

result = findall(r'd+b', message)
print(result)       # ['45', '89', '23', '910', '230', '90']

result = findall(r'bd+', message)
print(result)       # ['203', '89', '23', '99', '910', '230', '90']

result = findall(r'bd+b', message)
print(result)       # ['89', '23', '910', '230', '90']


# 2.B  -   检测是否不是单词边界
message = '203mn45,89 司机34kn;23;99mll==910,230 90='
result = findall(r'Bd+B', message)
print(result)


# 3.^   -   检测是否是字符串开头
message = '203mn45,89 司机34kn;23;99mll==910,230 90='
result = findall(r'^d+', message)
print(result)

# 提取字符串前5个字符
message = '203mn45,89 司机34kn;23;99mll==910,230 90='
result = findall(r'^.{5}', message)
print(result)


# 4.$   -   检测是否是字符串结尾
# 提取字符串最后5个字符
message = '203mn45,89 司机34kn;23;99mll==910,230 90='
result = findall(r'.{5}$', message)
print(result)


# '2233'
result = fullmatch(r'\d+', '92233')
print(result)
常用函数
from re import *

# 1. 常用函数
# 1) fullmatch(正则表达式, 字符串)      -  完全匹配,判断整个字符串是否符合正则表达式描述的规则,匹配成功返回匹配对象,匹配失败返回空
result = fullmatch(r'd{3}', '234')
print(result)

# 2) match(正则表达式, 字符串)  -   匹配字符串开头,判断字符串开头是否符合正则表达式描述的规则,匹配成功返回匹配对象,匹配失败返回空
result = match(r'd{3}', '823介绍数据库')
print(result)

# 3) search(正则表达式, 字符串)  - 获取字符串中第一个能够和正则匹配的子串,能找到返回匹配对象,找不到返回空
result = search(r'd{3}', 'ba203还是678说')
print(result)

# 4) findall(正则表达式, 字符串)    -   获取字符串中所有满足正则的子串,返回一个列表,列表中的元素是字符串。
# 注意:如果正则表达式中有分组,会针对分组做自动捕获(只获取分组匹配到的结果)
result = findall(r'd{3}', 'ba203还是678说kk0222jksn就是23311')
print(result)

# 5) finditer(正则表达式, 字符串)   -   获取字符串中所有满足正则的子串,返回一个迭代器,迭代器中的元素是每个子串对应的匹配对象
result = finditer(r'd{3}', 'ba203还是678说kk0222jksn就是23311')
print(result)
# print(next(result))
print(list(result))

# 6) split(正则表达式, 字符串)   -  将字符串中所有满足正则的子串作为切割点对字符串进行切割
str1 = '123aMKnb嗑生嗑死aKKssa923b==='
# 将str1中的a和b作为切割点对字符串进行切割
result = split(r'a|b', str1)
print(result)       # ['123', 'MKn', '嗑生嗑死', 'KKss', '923', '===']


# 7)sub(正则表达式, 字符串1, 字符串2)  - 将字符串2中所有满足正则的子串都替换成字符串1
result = sub(r'd+', '+', 'ba203还是678说kk0222jksn就是23311')
print(result)


message = '我草!你TM看不见吗?f u c k!'
result = sub(r'(?i)草|TM|fs*us*cs*k|sb|妈', '*', message)
print(result)


# 2.匹配对象
result = search(r'(d{3})([A-Z]{2})', '-=2设计师234KM222哈哈宿舍239KH')
print(result)       # 

# 1)直接获取整个正则表达式对应的匹配结果: 匹配对象.group()
print(result.group())       # '234KM'

# 2)手动捕获某个分组对应的匹配结果: 匹配对象.group(分组数)
print(result.group(1))      # '234'
print(result.group(2))      # 'KM'

# 3)获取匹配结果在原字符串中的位置: 匹配对象.span()
print(result.span())            # (6, 11)
print(result.span(2))           # (9, 11)


# 3.参数
# 1)匹配忽略大小写: (?i)
result = fullmatch(r'(?i)abc', 'AbC')
print(result)

# 2)单行匹配: (?s) (了解!)
"""
多行匹配(默认):匹配的时候.不能和换行(n)进行匹配
单行匹配:匹配的时候.可以和换行(n)进行匹配
"""
result = fullmatch(r'abc.123', 'abcn123')
print(result)       # None

result = fullmatch(r'(?s)abc.123', 'abcn123')
print(result)       # 


转载请注明:文章转载自 www.wk8.com.cn
本文地址:https://www.wk8.com.cn/it/1037741.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 wk8.com.cn

ICP备案号:晋ICP备2021003244-6号