17 Python - 正则表达式

正则表达式

在介绍正则表达式之前我们先认识一下re模块

re模块: python提供的专门使用正则表达式的相关的函数的模块

一.正则表达式

1.什么是正则表达式?

正则表达式是一种让字符处理更简单的工具(本质是做字符串匹配)

2.正则表达式的语法

from re import fullmatch, search, findall
fullmatch(正则表达式, 字符串)  - 让正则表达式式和字符串进行完全匹配,如果匹配失败结果是None
js的正则: /正则表达式/
python的正则: r'正则表达式'

1) 匹配符号

①普通字符 - 表示字符本身

re_str = r'abc'
result = fullmatch(re_str,'abc')
print(result) # <_sre.SRE_Match object; span=(0, 3), match='abc'>

② . - 匹配一个任意字符

re_str = r'.abc'
result = fullmatch(re_str, '+abc')
print(result) # <_sre.SRE_Match object; span=(0, 4), match='+abc'>

练习1: 匹配一个长度是5的字符串,字符串中间三个字符是abc,第一个字符和最后一个字符任意

re_str = r'.abc.'
result = fullmatch(re_str, '(abc+')
print(result) #<_sre.SRE_Match object; span=(0, 5), match='(abc+'>

练习2: 匹配一个长度是3的任意字符串

re_str = r'...'
result = fullmatch(re_str, 'ajs')
print(result) # <_sre.SRE_Match object; span=(0, 3), match='ajs'>

③\w - 匹配任意一个数字、字母或者下划线(针对ASCII码表有效)

(注意:平时不用)

re_str = r'\wabc'
result = fullmatch(re_str, '8abc')
print(result) # <_sre.SRE_Match object; span=(0, 4), match='8abc'>

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

re_str = r'\d\d\d'
result = fullmatch(re_str, '142')
print(result) # <_sre.SRE_Match object; span=(0, 3), match='142'>

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

re_str = r'\s\d..'
result = fullmatch(re_str, '\n9k/')
print(result) # <_sre.SRE_Match object; span=(0, 4),match='\n9k/'>

⑥\D 和 \S

\字母 - 小写字母和对应的大写字母的功能相反

re_str = r'\dabc\D'
result = fullmatch(re_str, '8abc-')
print(result) #<_sre.SRE_Match object; span=(0, 5), match='8abc-'>

⑦[字符集] - 匹配字符集中出现的任意一个字符

注意:一个[]只能匹配一个字符
a.
[abc123]  -  匹配 a、b、c、123 中任意一个字符
b.
[a-z]    -   匹配从字符a到字符z之间的任意一个字符(匹配任意一个小写字母)
[A-Z]    -   匹配任意一个大写字母
[a-zA-Z] -   匹配任意一个字母
[0-9]    -   匹配任意一个数字字符
[\u4e00-\u9fa5]   - 匹配任意一个中文字符

练习3:判断输入手机号码是否合法

re_str = r'1[3-9]\d\d\d\d\d\d\d\d\d'  
result = fullmatch(re_str, '13598902763')
print(result)

练习4:写一个正则表达式,要求可以匹配一个字符串:abc前面是一个数字、字母或者下划线

re_str = r'[a-zA-Z\d_]abc'
result = fullmatch(re_str, '_abc')
print(result)

⑧[^字符集] - 取不在字符集中任意一个字符

[^\u4e00-\u9fa5]   - 匹配任意一个非中文字符
[^0-9]  -  匹配任意一个非数字字符
[^a-zA-Z]  - 匹配任意一个非字母字符
print(fullmatch(r'[abc^]123', 'b123'))
print(fullmatch(r'[^abc]123', 'a123'))

2) 检测符号

①\b - 检测是否是单词的边界

单词边界:字符串开头,字符串结尾,凡是能区分出两个不同单词的符号

注意:检测类的符号不影响匹配的长度,只是在匹配成功的时候做进一步的检测

message = 'how are you?i am fine!thank you!'
re_str = r'\d\d.\b\d\d'
print(fullmatch(re_str, '56=89'))
# <_sre.SRE_Match object; span=(0, 5), match='56=89'>

② ^ - 检测 ^ 所在的位置是否是字符串的开头

re_str = r'\d^abc'
print(fullmatch(re_str, '1abc')) # None

re_str = r'^\d\d\d'
print(fullmatch(re_str, '678')) 
# <_sre.SRE_Match object; span=(0, 3), match='678'>

③ $ - 检测$所在的位置是否是字符串结尾

re_str = r'\d\d$'
print(search(re_str, '蜡笔7823小新89'))
# <_sre.SRE_Match object; span=(8, 10), match='89'>

3) 匹配次数

① * - 匹配0次或多次

re_str = r'a*'
print(fullmatch(re_str, 'aaa'))
# <_sre.SRE_Match object; span=(0, 3), match='aaa'>

② + - 匹配一次或多次(至少一次)

re_str = r'a+'
print(fullmatch(re_str, 'a'))
# <_sre.SRE_Match object; span=(0, 1), match='a'>

③ ? - 匹配0次或1次

re_str = r'\d?abc'
print(fullmatch(re_str, '0abc'))
# <_sre.SRE_Match object; span=(0, 4), match='0abc'>

练习5: 写一个正则表达式可以匹配任意一个整数字符串

re_str = r'[-+]?\d+'
print(fullmatch(re_str, '+23874'))
# <_sre.SRE_Match object; span=(0, 6), match='+23874'>

④ {}

{N}   -  匹配N次
{M,N}  - 匹配M到N次
{M,}   - 匹配至少M次
{,N}   - 匹配最多N次(0~N次)
re_str = r'\d{4}abc'
print(fullmatch(re_str, '6723abc'))
# <_sre.SRE_Match object; span=(0, 7), match='6723abc'>

re_str = r'a{2,5}123'
print(fullmatch(re_str, 'aaaaa123'))
# <_sre.SRE_Match object; span=(0, 8), match='aaaaa123'>

re_str = r'a{2,}123'
print(fullmatch(re_str, 'aaaaaaaaaaa123'))
# <_sre.SRE_Match object; span=(0, 14), match='aaaaaaaaaaa123'>

re_str = r'a{,2}123'
print(fullmatch(re_str, 'aa123'))
# <_sre.SRE_Match object; span=(0, 5), match='aa123'>

4) 贪婪和非贪婪

在匹配次数不确定的情况下,匹配模式分为两种:贪婪和非贪婪

①贪婪:默认都是贪婪的(在能匹配到的前提下匹配次数尽可能多)

​ *、+、?, {M,N}、{M,}、{,N} 都是贪婪

②非贪婪:(在能匹配到的前提下匹配次数尽可能少)在匹配次数不确定的时候,次数后面加问号,匹配就是非贪婪的

​ *? 、+?、??、{M,N}?、{M,}?、{,N}? 都是非贪婪

5) 分支和分组

① 分支: |

语法: 正则1|正则2|正则3
# 写一个正则匹配一个字符串:123abc 和 456abc
re_str = r'123abc|456abc'
print(fullmatch(re_str, '456abc'))

re_str = r'123|345abc'
print(fullmatch(re_str, '123abc'))   # None
print(fullmatch(re_str, '123'))
print(fullmatch(re_str, '345abc'))

② 分组: ()

a.整体操作:

# abc出现3次
re_str = r'(abc){3}'
print(fullmatch(re_str, 'abcabcabc'))

# 写一个正则匹配一个字符串:123abc 和 456abc
re_str = r'(123|456)abc'
print(fullmatch(re_str, '456abc'))

# 两个数字两个字母的结构重复4次: 34hj56kl67uj23Bm
re_str = r'(\d\d[a-zA-Z]{2}){4}'
print(fullmatch(re_str, '34hj56kl67uj23Bm'))

b.重复: \M - 重复前面第M个分组匹配到的内容(M从1开始)

re_str = r'(\d\d)=\1abc'
print(fullmatch(re_str, '67=67abc'))
# <_sre.SRE_Match object; span=(0, 8), match='67=67abc'>

re_str = r'(\d\d)-([a-z]{3})-\2-\1'
print(fullmatch(re_str, '23-bnm-bnm-23'))
# <_sre.SRE_Match object; span=(0, 13), match='23-bnm-bnm-23'>

6) 转义符号:

在具有特殊功能或者特殊意义的符号前加 \ ,让功能消失

re_str = r'\.\d\d'
print(fullmatch(re_str, '.23'))
# <_sre.SRE_Match object; span=(0, 3), match='.23'>

re_str = r'abc\+\d\d'
print(fullmatch(re_str, 'abc+34'))
# <_sre.SRE_Match object; span=(0, 6), match='abc+34'>

注意: 独立存在有特殊功能的符号在[]中功能会自动消失

re_str = r'[-+.]abc'
print(fullmatch(re_str, '.abc'))
# <_sre.SRE_Match object; span=(0, 4), match='.abc'>
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值