day17-正则表达式

正则表达式

  • 让复杂字符变简单的工具
fullmatch(正则表达式,字符串)  - 判断整个字符串是否满足正则表达式所描述的规则
findall(正则表达式,字符串)  -提取字符串中所有满足正则表达式的字符串
search(正则表达式,字符串) -匹配字符串中第一个满足正则表达式的字串
注意:python中表达式一个正则表达式一般用r字符串

正则符号

正则符号
1.普通符号 - 在正则表达式中表符号本身的符号

2  .-匹配任意一个字符

3. \d     -匹配任意一个数字字符

4. \s     -匹配任意一个空白字符

5.\w  - 匹配任意一个字母、数字、下划线或者中文

6.\W \D \S  与 \w \d \s  功能相反

7.[字符集]   -匹配在字符集中的任意一个字符
[abc\d]  -可以是a 或 b 或c  或任意一个数字
[a-z]        -匹配任意个小写字母
[a-zA-Z]     -匹配任意一个字母
[a-zA-Z\d]   -匹配任意一个或者数字
[a-z=%]      -匹配任意一个小写字母或者 = 或者 %
[\u4e00-\u9fa5]  -匹配任意一个中午     


8.[^字符集]  -匹配不在字符集中的任意一个字符
  • 应用
result = fullmatch(r'abc', 'abc')
print(result)

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

# 3.匹配任意一个数字字符
result = fullmatch(r'\d\dabc', '08abc')
print(result)

# 匹配任意一个空白符
result = fullmatch(r'123\sabc', '123\tabc')
print(result)

# \w  - 匹配任意一个字母、数字、下划线或者中文
result = fullmatch(r'abc\w123', 'ad')

# [^字符集]  -匹配不在字符集中的任意一个字符
result1 = fullmatch(r'abc[^MN]', 'abc)123')
print(result1)

匹配次数符号

第二类符号:匹配次数符号
1.  *  - 任意次数(0次或者1次或者任意数)
a*      -   a出现任意次数
\d*     -   任意多个数字
[abc]*  -   


2.  ?  -  0次或者 1次   -最多1次

3.  +  -   至少一次
"""
result = fullmatch(f'1a*2', '12')  # 对的,可以是0个
print(result)  # <re.Match object; span=(0, 2), match='12'>

"""
{N}         -       N次
{M,N}       -       M到N
{M,}        -       最少M次
{,N}        -       最多N次


"""

# 练习:写一个正则表达式,可以匹配任意一个除了0的整数。
# 合法:233、+234、-7283、100、-2000
# 不合法:0、0002、2.23

# result=fullmatch(r'[-]?[1-9]\d*','1123')
# print(result)
  • 贪婪匹配
"""
贪婪和非贪婪模式
在匹配次数不确定的时候,如果有多种次数都可以匹配成功,贪婪取最多的那个次数,非贪婪取最少的那个次数
(默认贪婪)
贪婪模式:+,?,*
非贪婪模式:+?、??、*?、  加?号

"""

# result=search(r'a.+b','a12b2b3b')
# print(result) #match='a12b2b3b'
#
# result=search(r'a.+?b','a12b2b3b')
# print(result) #match='a12b'

分支和分组

============第三类符号:分组和分支=========
正则表达式中可以用()将部分内容括起来表示一个整体,括号括起来的部分就是一个分组
a.整体操作的时候需要分组
b.重复匹配-正则中可以通过\M来重复它前面从头往后数第M个分组匹配的结果
c.提取分组匹配到的结果(捕获分为自动捕获(findall)和手动捕获)
"""

# '23M'、'89K10L'、09H23P90Q33W'、.
result = fullmatch(r'(\d\d[A-Z])+', '09H23P90Q33W')
print(result)

# "23H23'、'90K90'、'78N78'、'10U10'
result = fullmatch(r'(\d\d)[A-Z]\1', '90K90')
print(result)

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

# findall在正则表达式中有分组的时候,会自动提取正则匹配结果中分组匹配到的内容
message = '技术上234,jsskf8992==技术njk==9223-ssjs233结束时间453'
result = findall(r'[\u4e00-\u9fa5](\d+)', message)
print(result)



#匹配对象.group(N) -获取匹配结果中指定分组匹配到的内容
#提取身高
message ='我是小明,今年23岁,身高180厘米,体重70kg'
result = search(r'身高(\d+)厘米,体重(\d+)kg', message)
print(result)
#<re.Match object; span=(11,25), match='身高180厘米,体重70kg
print(result.group())
#'身高180厘米,体重70kg'
print(result.group(1), result.group(2))
#180 70



"""
分支 -|
正则1|正则2|正则3|.. 先用正则1进行匹配,匹配成功直接成功;匹配失败用正则2进行匹配....
"""
result=fullmatch(r'\d{3}|[a-z]{2}','mn')
print(result)

result=fullmatch(r'abc\d\d|abc[a-z]{2}','abc12')
print(result)

转义符号

#=============================转义字符=========================
转义符号:在本身具有特殊功能或者特殊意义的符号前加 \ ,让特殊符号变成普通

"""
result = fullmatch(r'\d\d\.\d\d','12.34')
print(result)

result = fullmatch(r'\([a-z]{2}\)','(az)')
print(result)

re模块

1)fullmatch(正则,字符串)–用整个字符串和正则,匹配成功返回匹配对象,匹配失败返回None
2)findall(正则,字符串)·获取字符串中所有满足正则的子串,默认返回一个列表,列表中的元素是所有匹配到的子串(存在自动捕获现象)
3)search(正则,字符串)-匹配第一个满足正则的子串,匹配成功返回匹配对象,匹配失败返回None
4)split(正则,字符串)-将字符串中所有满足正则的子串作为切割点进行切割
5)split(正则,字符串,N)-将字符串中前N个满足正则的子串作为切割点进行切割
6)sub(正则,字符串1,字符串2)-将字符串2中所有满足正则的子串都替换成字符串1
7)sub(正则,字符串1,字符串2,N)
8)finditer(正则,字符串)–获取字符串中所有满足正则的子串,返回一个迭代器,迭代器中的元素是匹配对象


"""
str1 ='技术7晋级赛7jsks7就开始看'
print(str1.split('7'))

str1 ='技术22晋级赛709jsks511就开始80看'
print(split(r'\d+' , str1, 2))

str1 ='技术22晋级赛709jsks511就开始80看'
print(sub(r' ld','+', str1))

message ='妈的,SB,都打起来了你还在打野!草!F u c k'
print(sub(r'(?i)妈的|sb|草|操|艹|f\s*u\s*c\s*k','*', message))

sr1 ='技术22晋级赛709jsks511就开始80看'
result = finditer(r'\d+', str1)
print(list(result))

print(fullmatch(r'\d{3}','234'))
print(match(r'\d{3}', '234卡咖啡'))

#1忽略大小写  (?i)
print(fullmatch(r'(?i)abc','abc'))
print(fullmatch(r'(?i)abc ','Abc'))
print(fullmatch(r'(?i)abc', 'ABc'))
print(fullmatch(r'(?i)abc', 'aBc'))


#2)单行匹配:(?s)
#多行匹配(默认)∶。不能和换行符进行匹配#单行匹配:.可以和换行符进行匹配
print(fullmatch(r'abc.123', 'abcin123'))
#None
print(fullmatch(r'(?s)abc.123', 'abc\n123'))
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值