正则表达式(re模块)

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

1.正则表达式

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

2.正则表达式的语法

fullmatch(正则表达式, 字符串) - 让正则表达式式和字符串进行完全匹配,如果匹配失败结果是None

python中的正则: r’正则表达式’

以下是匹配符号

1) 普通字符 - 表示字符本身

re_str = r'abc'
result = fullmatch(re_str, 'abc')
print(result)

2) . - 匹配一个任意字符

re_str = r'.abc'
result = fullmatch(re_str, '+abc')
print(result)

3)\w - 匹配任意一个数字、字母或者下划线(针对ASCII码表有效)(注意:平时不用)

re_str = r'\wabc'
result = fullmatch(re_str, '8abc')
print(result)

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

re_str = r'\d\d\d'
result = fullmatch(re_str, '142')
print(result)

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

re_str = r'\d\d\s\d\d'
result = fullmatch(re_str, '78 23')
print(result)

6) \D和\S - 正则表达式中 \字母 表示小写字母和对应的大写字母的功能相反

re_str = r'\dabc\D'
result = fullmatch(re_str, '8abc-')
print(result)

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

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

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

re_str = r'[cz+?]123'
result = fullmatch(re_str, '?123')
print(result)

re_str = r'[\u4e00-\u9fa5]123'
result = fullmatch(re_str, '看123')
print(result)

[]中减号前面的字符编码值必须小于-后面的字符编码

[]中减号如果不在两个字符之间,-就没有特殊功能直接表达它本身

result = fullmatch(r'[-09]abc', '-abc')
print(result)

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

[^\u4e00-\u9fa5] - 匹配任意一个非中文字符
[^0-9] - 匹配任意一个非数字字符
[^a-zA-Z] - 匹配任意一个非字母字符

print(fullmatch(r'[abc^]123', 'b123'))    # 当^不在最前面时就表示^本身
print(fullmatch(r'[^abc]123', 'a123'))

以下是检测符号

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

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

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

re_str = r'\d\d.\b\d\d'
print(fullmatch(re_str, '56=89'))

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

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

re_str = r'^\d\d\d'
print(fullmatch(re_str, '678'))

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

re_str = r'\d\d$'
print(search(re_str, '时代峰峻78暗示法23沙发89'))  # <re.Match object; span=(13, 15), match='89'>

以下是匹配次数的符号

1)* - 匹配0次或多次

字符 - 字符出现0次或多次*

re_str = r'a*'
print(fullmatch(re_str, 'aaa'))

re_str = r'\d*'
print(fullmatch(re_str, '478923'))

2) + - 匹配1次或多次(至少1次)

re_str = r'a+'
print(fullmatch(re_str, 'a'))

3) ? - 匹配0次或1次

re_str = r'\d?abc'
print(fullmatch(re_str, '0abc'))

4) {}

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

re_str = r'\d{4}abc'
print(fullmatch(re_str, '6723abc'))

re_str = r'a{2,5}123'
print(fullmatch(re_str, 'aaaaa123'))

re_str = r'a{2,}123'
print(fullmatch(re_str, 'aaaaaaaaaaa123'))

re_str = r'a{,2}123'
print(fullmatch(re_str, 'aa123'))

5)贪婪和非贪婪

在匹配次数不确定的情况下,匹配模式分为两种:贪婪和非贪婪
①贪婪:默认都是贪婪的(在能匹配到的前提下匹配次数尽可能多)
*、+、?, {M,N}、{M,}、{,N}

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

re_str = r'\d{2,}'
print(search(re_str, '护士227382abc你好!'))

re_str = r'\d{2,}?'
print(search(re_str, '护士227382abc你好!'))

1、分支:|

语法:

正则1|正则2|正则3|…(类比or)

例:写一个正则匹配一个字符串:123abc和456abc

re_str = r'123abc|456abc'
print(fullmatch(re_str, '456abc'))

2、分组:()

1)整体操作

例:abc出现三次

re_str = r'(abc){3}'
print(fullmatch(re_str, 'abcabcabc'))

例:写一个正则匹配一个字符串:123abc和456abc

re_str = r'(123|456)abc'
print(fullmatch(re_str, '123abc'))
print(fullmatch(re_str, '456abc'))

2)重复:
\N - 重复前面第N个分组匹配到的内容(N从1开始)匹配到的内容要相同

re_str = r'(\d\d)asdf\1abc'
print(fullmatch(re_str, '12asdf12abc'))

3、转移符号:

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

注意:独立存在有特殊功能的符号在[]中功能会自动消失(特例:-,^,$)

re_str=r'[+\-.]abc'
print(fullmatch(re_str,'+abc'))
print(fullmatch(re_str,'.abc'))
print(fullmatch(re_str,'-abc'))

re模块的相关方法

1、compile()

compile(正则表达式) - 编译正则表达式,创建正则表达式对象

re_obj = compile(r'\d{3}')

fullmatch(r'\d{3}', '234')
re_obj.fullmatch('234')

search(r'\d{3}', 'hu23hjk890jhkh78')
re_obj.search('hu23hjk890jhkh78')
2.匹配

1)fullmatch(正则表达式, 字符串) - 让整个字符串和正则表达式进行匹配
2)match(正则表达式, 字符串) - 匹配字符串开头如果匹配不到结果是None,如果匹配成功了结果是匹配对象

re_str = r'\d{3}'
print(fullmatch(re_str, '732'))
print(fullmatch(re_str, '732hjas'))   # None
print(match(re_str, '789'))
print(match(re_str, '11789j手机打开'))

设置同时忽略大小写和单行匹配

print(fullmatch(r'123.[a-z]{3}', '123\nHNA', flags=S|IGNORECASE))
print(fullmatch(r'(?is)123.[a-z]{3}', '123\nHNA'))
3.匹配对象

1) 获取匹配到的字符串

匹配对象.group()

匹配对象.group(分组号) - 获取正则表达式中指定的分组匹配到的结果(分组号从1开始)

2) 获取匹配到的子串的范围

匹配对象.span()

3) 获取原字符串

匹配对象.string()

4、查找

1)search(正则表达式,字符串) - 在字符串中查找第一个能和正则表达式匹配的的子串,
如果找到返回匹配对象,找不到返回None

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

3)finditer(正则表达式,字符串) - 获取字符串中所有满足正则表达式的子串,
返回一个迭代器

str1 = 'a4da4d5a5sd4asdas545a'
result = search(r'\d', str1)
print(result.group())

# findall正则中如果有分组,只获取分组匹配到的内容
result = findall(r'(\d+)[a-z]', str1)
print(result)

result = finditer(r'\d[a-z]', str1)
print(list(result))
5、切割

split(正则表达式,字符串) - 将字符串中能和正则表达式匹配的字串作为切割点,值是列表,列表中的元素是子字符串

str1 = 'asda123dadwd1a32a4wd123ewdawa132aw1d23123'
result = re.split(r'\d+', str1)
print(result)
6、替换

sub(正则表达式,字符串1,字符串2) - 字符串2中能和正则表达式匹配的子串全部替换成字符串1

get_str=input()
str1=re.sub(r'[妈]','🎇',get_str)
print(str1)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值