16正则表达式

正则表达式

  • 正则表达式匹配符号

1.什么是正则表达式
正则表达式是一种可以让字符串处理变得很简单的工具
正则表达式就是通过各种正则符号来描述字符串的规则
在不同的编程语言中,正则的语法是相同的,但是表示方式不同:python - ‘正则表达式’ js - /正则表达式/

2.正则表达式

  1. 普通字符 - 普通字符在正则表达式中表示这个符号本身
    fullmatch(正则表达式, 字符串) - 判断字符串是否符合正则所描述的规则,符合不是None,否则是None
from re import fullmatch

re_str = 'abc' # 规则:一个字符串,分别是a,b和c
result = fullmatch(re_str, 'abc')
print(result) # <re.Match object; span=(0, 3), match='abc'>

  1. . - 匹配一个任意字符
    ‘a.b’ - 匹配一个长度是3的字符串,第一个字符是a,最后字符是b,中间一个是任意字符
re_str = 'a.b'
result = fullmatch(re_str,'akb')
print(result) # <re.Match object; span=(0, 3), match='akb'>

re_str = 'a.b'
result = fullmatch(re_str,'a+b')
print(result) # <re.Match object; span=(0, 3), match='a+b'>

re_str = 'a.b'
result = fullmatch(re_str,'akkb')
print(result) # None

re_str = 'xy..' # 匹配一个长度为4,前两个字符是x和y,后面是两个任意字符的字符串
result = fullmatch(re_str, 'xyj就')
print(result) # <re.Match object; span=(0, 4), match='xyj就'>
  1. \d - 匹配任意一个数字
re_str = 'a\db' # 匹配一个长度是3,第一个字符是a,最后一个字符是b,中间是一个任意数字字符
result = fullmatch(re_str, 'a0b')
print(result) # <re.Match object; span=(0, 3), match='a0b'>
  1. \s - 匹配一个空白字符
    空白字符:空格字符,\n,\t
re_str = 'abc\s123'
result = fullmatch(re_str, 'abc 123')
print(result) # <re.Match object; span=(0, 7), match='abc 123'>

result = fullmatch(re_str,'abc\t123')
print(result) # <re.Match object; span=(0, 7), match='abc\t123'>

result = fullmatch(re_str,'abc\n123')
print(result) # <re.Match object; span=(0, 7), match='abc\n123'>
  1. \w (了解) - 匹配一个字母,数字或者下划线(ASCII码表以外的字符都可以匹配)
re_str = '\d\w\d'
result = fullmatch(re_str, '2_8')
print(result)

\D - 匹配任意一个非数字字符
\S - 匹配任意一个非空白字符

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

注意:一个[]只能匹配一个字符
在[]中可以将-放在两个字符之间表示范围,但是-前面的字符的编码必须小于后面字符的编码值
在[]中-只有在两个字符之间才有特殊意义,如果在最前面或者最后面就表示-本身

[a1+] - 匹配字符a或者1或者+

[1-9] - 匹配1到9的任意一个数字字符
[a-z] - 匹配任意一个小写字母
[\u4e00-\u9fa5] - 匹配任意一个中文

下列写法都支持:
[a-z+=/]
[1a-z2]
[2-8a-z]

re_str = 'a[xy0]b' # 匹配一个长度是3,第一个字符是a,最后一个是b,中间是x,y,0中的任意一个字符的字符串
  1. [^字符集] - 匹配一个不在字符集中的任意一个字符

[^abc] - 匹配除了a,b,c以外的任意字符
[^\d] - 匹配任意一个非数字字符
[^a-z] - 匹配任意一个非小写字母字符

re_str = '\d[abc]\d'
print(fullmatch(re_str, '3a6'))

re_str = '\d[abc^]\d'
print(fullmatch(re_str,'3^6')) # <re.Match object; span=(0, 3), match='3^6'>
  • 检测类符号

匹配类的符号:一个符号需要对应一个字符;检测类的符号不影响字符串的长度,只是在匹配成功后做一个检测,检测符号所在的位置是否符合要求
1.\b - 检测是否是单词边界
\B - 检测是否不是单词边界
单词边界 - 生活中可以将两个单词区分开来的字符,例如:空格,标点符号,字符串开头和字符串结尾

from re import fullmatch,findall

re_str = r'abc,\b123'
result = fullmatch(re_str, 'abc,123')
print(result)



re_str = r'\b\d\d\b'
str1 = '安抚86违反按违规ad,28 我服你jpofj65'
result = findall(re_str,str1)
print(result) # ['28']

2.^ - 检测字符串开头

re_str = '^\d\d\d'
result = fullmatch(re_str,'892')
print(result) # <re.Match object; span=(0, 3), match='892'>

result = findall(re_str,'889akjfb你发我牛二分部666qfw6ef554')
print(result) # ['889']

3.$ - 检测是否是字符串结尾

re_str = '\d\d\d$'
result = findall(re_str,'889akjfb你发我牛二分部666qfw6ef554')
print(result) # ['554']
  • 匹配次数

1.+ - 一次或多次

a+ - 字符a出现一次或者多次
\d+ - 匹配一次或者多次任意数字字符

re_str = 'xa+y'
result = fullmatch(re_str,'xay')
print(result) # <re.Match object; span=(0, 3), match='xay'>

result = fullmatch(re_str,'xaay')
print(result) # <re.Match object; span=(0, 4), match='xaay'>

2.* - 匹配任意次数(包括0次)

re_str = 'xa*y'
print(fullmatch(re_str,'xy')) # <re.Match object; span=(0, 2), match='xy'>

3.? - 匹配0次或一次

print(fullmatch('0?abc','0abc')) # <re.Match object; span=(0, 4), match='0abc'>

# 练习:写一个正则表达式来检测字符串是否是合法的整数
print(fullmatch('[+-]?[1-9][0-9]*','9'))

{N} - 匹配N次
{M,N} - 匹配M到N次(最少M次,最多N次)
{M,} - 匹配至少M次
{,N} - 匹配最多N次

print(fullmatch('a{4}\d{3}','aaaa345'))
print(fullmatch('a{2,4}\d{2,}[a-z]{,3}]','aaaa'))

(重要)5.贪婪和非贪婪
在匹配次数不确定的时候,匹配分为贪婪和非贪婪两种,默认都是贪婪的。
1)贪婪 - 匹配次数不确定,默认贪婪(+、、?、{M,N}、{M,}、{,N})
贪婪:在能匹配成功的前提下,取匹配次数最多的结果(假设3次4次6次都能匹配成功,最后取6次)
2)非贪婪 - 在匹配次数不确定的次数后加?(+?、
?、??、{M,N}?、{M,}?、{,N}?)
非贪婪:在能匹配成功的前提下,取匹配次数最少的结果

re_str = r'a.+?b'
print(findall(re_str,'amnmb123blkb计算机上'))
  • 分组和分支

1.() - 分组

分组就是将正则表达式中的某部分用()括起来看成一个整体,然后进行整体操作
在正则表达式中一个()表示一个分组
1)整体操作
‘(\d{2}[a-z]{3])+’

2)整体重复
\M - 重复前面第M个分组匹配到的内容

from re import fullmatch

print(fullmatch('(\d{2}[a-z]{3})+','23hsk90nmd')) # <re.Match object; span=(0, 10), match='23hsk90nmd'>

re_str = r'(\d{3})ab\1'
print(fullmatch(re_str,'789ab789')) # <re.Match object; span=(0, 8), match='789ab789'>
print(fullmatch(re_str,'112ab321')) # None

re_str = r'(\d{3})([a-z]{2})=\1{2}'
print(fullmatch(re_str,'341ab=341341'))

re_str = r'(\d{3})([a-z]{2})=\2\1'
print(fullmatch(re_str,'341ab=ab341'))

2.| - 分支
正则1|正则2

# 练习:写一个正则表达式,能够匹配一个字符串是:abc后面是三个任意数字,或者三个任意大写字母
# 'abc827'、'abcKNM'
print(fullmatch('abc(\d{3}|[A-Z]{3})','abc1A3'))

3.转义符号
在正则中有特殊意义的符号前加\让这个符号的功能消失,表示这个符号本身

re_str = '\d{2}\.[a-z]{3}'
print(fullmatch(re_str,'89.hsk'))

# 注意:除了在[]中有特殊意义的符号外(-和^),其他的符号在[]里面都表示这个符号本身
  • re模块

1.fullmatch(正则表达式, 字符串) - 判断字符串和正则表达式是完全匹配, 如果可以匹配返回匹配对象,否则返回None
2.match(正则表达式, 字符串) - 判断字符串的开头是否和正则匹配,如果可以匹配返回匹配对象,否则返回None

from re import fullmatch, match, search, findall, split, sub

re_str = '\d{3}'
print(fullmatch(re_str, '892'))
print(match(re_str, '923海兽祭祀shsjjj'))

3.search(正则表达式, 字符串) - 获取字符串中第一个满足正则表达式的子串,如果可以匹配返回匹配对象,否则返回None

print(search(re_str, 'jsjh892sjjdjjs2'))    # <re.Match object; span=(4, 7), match='892'>

4.findall(正则表达式, 字符串) - 获取字符串中所有满足正则表达式的子串,返回一个列表

print(findall(re_str, 'jsj 2839计算机282开始了11234,hss273681kl892p'))   # ['283', '282', '112', '273', '681', '892']

re_str = '\d{3}[a-z]'
print(findall(re_str, 'jsj 2839计算机282开始了11234,hss273681kl892p'))   # ['681k', '892p']

re_str = '(\d{3})[a-z]'
print(findall(re_str, 'jsj 2839计算机282开始了11234,hss273681kl892p'))    # ['681', '892']

re_str = '\d{2}[a-z]{2}'
print(findall(re_str, 'jsj89op就是789mn-=s函数56mn82是否879、'))    # ['89op', '89mn', '56mn']

re_str = '\d{2}([a-z]{2})'
print(findall(re_str, 'jsj89op就是789mn-=s函数56mn82是否879、'))    # ['op', 'mn', 'mn']

re_str = '(\d{2})([a-z]{2})'
print(findall(re_str, 'jsj89op就是789mn-=s函数56mn82是否879、'))    # [('89', 'op'), ('89', 'mn'), ('56', 'mn')]

5.split(正则表达式, 字符串) - 将字符串中所有满足正则表达式的子串作为切割点,对字符串进行切割

print(split('[a-z]+', '你好akslb江苏省a护具b==='))    # ['你好', 'ksl', '江苏省', '护具', '===']

6.sub(正则表达式, 字符串1, 字符串2) - 将字符串2中满足正则表达式的子串都替换成字符串1

print(sub('\d+', '+', '就是90JJ是239jsj函数2海事局'))
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值