Python进阶学习笔记(五) —— 正则表达式


1 正则表达式简介


正则表达式是一种用来匹配字符串的强有力的武器。设计思想是用一种描述性的语言来给字符串定义一个规则,凡是符合规则的字符串,就认为它“匹配”,否则就不匹配。

2 元字符


(1)^$

行定位符用来描述字符串的边界。^表示行的开始,$表示行的结束。
例如:

  • 若要匹配以am开头的字符串,则是^am
  • 若要匹配以am结尾的字符串,则是am$

注意:^放在方括号里,表示排除字符
例如:[^a-zA-Z]用于匹配一个不是字母的字符

(2).

匹配除换行符\n以外的任意字符

(3) \w

匹配字母、数字、下划线或汉字

(4)\W

匹配除字母、数字、下划线或汉字以外的字符

(5)\s

匹配单个空白符(包括\n\t

(6) \S

匹配除单个空白符(包括\n\t)以外的字符

(7) \d

匹配数字

(8) \D

匹配非数字的字符

(9) \b

匹配单词的开始或结束,单词的分界符通常是空格,标点符号或者换行。但是\b并不匹配这些单词分隔字符中的任何一个,它只匹配一个位置。\b匹配这样的位置:它的前一个字符和后一个字符不全是(一个是,一个不是或不存在) \w

有关\b可详见:https://www.cnblogs.com/litmmp/p/4925374.html

3 限定符


(1)

匹配前面的字符零次或一次

(2)*

匹配前面的字符零次或多次

(3) +

匹配前面的字符一次或多次

(4) {n}

匹配前面的字符n次

(5) {n,}

匹配前面的字符至少n次

(6){n,m}

匹配前面的字符最少n次,最多m次

4 字符类


如果要匹配未预定义的元字符集合,只需要在方括号里列出它们就可以了
例如:
[aeiou]:匹配任意一个英文元音字母
[0-9]:匹配一位数字,与\d代表含义完全一致
[\u4e00-\u9fa5]:匹配字符串中任意一个汉字

python提供了re模块,用于实现正则表达式的操作。在实现时,可以用re模块提供的方法进行字符串处理,也可以先使用re模块compile()方法将模式字符串转换为正则表达式对象,然后再用该正则表达式对象的相关方法来操作字符串。

5 匹配字符串

5.1 使用match()方法进行匹配


match() 方法用于从字符串的开始处进行匹配,如果在起始位置匹配成功,则返回match()对象,否则返回 None。

语法格式如下:

re.match(pattern, string, [flags])
参数描述
pattern匹配的正则表达式
string要匹配的字符串。
flags标志位,可选参数,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等。

可选标志

在这里插入图片描述

例如:

import re

pattern = r'tb_\w+'
string = 'TB_SHOP tb_shop'
match = re.match(pattern, string, re.I)
# 匹配出TB_SHOP这七个字符
print(match) # <re.Match object; span=(0, 7), match='TB_SHOP'>
# match对象中包含了匹配值的位置和匹配数据
print('匹配值的起始位置:', match.start()) # 匹配值的起始位置: 0
print('匹配值的结束位置:', match.end()) # 匹配值的结束位置: 7
print('匹配位置的元组:', match.span()) # 匹配位置的元组: (0, 7)
print('要匹配的字符串:', match.string)  # 要匹配的字符串: TB_SHOP tb_shop # 注意该方法没有括号
# group()或者group(0)将返回整个匹配的子串,group(n)将返回第n个对应的字符串,n从1开始
print('获取匹配到的内容:', match.group())

string = '商店名称TB_SHOP tb_shop'
match = re.match(pattern, string, re.I)
# 当第一个字母不符合条件时则不再进行匹配,直接返回None
print(match) # None

group()用法详见
https://www.cnblogs.com/erichuo/p/7909180.html

5.2 使用search()方法进行匹配


search() 方法用于在整个字符串搜索第一个匹配的值,如果匹配成功,则返回 match() 对象,否则返回None。

语法格式如下:

re.search(pattern, string, [flags])

例如:

import re
pattern=r'tb_\w+'
string='TB_SHOP tb_shop'
match=re.search(pattern,string,re.I)
# 匹配出TB_SHOP这七个字符
print(match)

string='商店名称TB_SHOP tb_shop'
match=re.search(pattern,string,re.I)
print(match)

执行结果如下:

<_sre.SRE_Match object; span=(0, 7), match='TB_SHOP'>
<_sre.SRE_Match object; span=(4, 11), match='TB_SHOP'>

5.3 使用findall()方法进行匹配


findall() 方法用于在整个字符串搜索所有符合正则表达式的字符串,并以列表形式返回。如果匹配成功,则返回包含匹配结构的列表,否则返回空列表。

语法格式如下:

re.findall(pattern, string, [flags])

例如:

import re

pattern = r'tb_\w+'
string = 'TB_SHOP tb_shop'
match = re.findall(pattern, string, re.I)  # 不区分大小写
# 匹配出TB_SHOP这七个字符
print(match)

string = '商店名称TB_SHOP tb_shop'
match = re.findall(pattern, string)  # 区分大小写
print(match)

执行结果如下:

['TB_SHOP', 'tb_shop']
['tb_shop']

6 替换字符串


sub方法用于实现字符串的替换。

subn() 方法几乎与 sub()一样,但是会返回一个替换的次数。

语法格式如下:

re.sub(pattern, repl, string, [count], [flags])

pattern : 正则中的模式字符串。
repl : 替换的字符串,也可为一个函数
string : 要被查找替换的原始字符串。
count : 可选参数,模式匹配后替换的最大次数,默认 0 表示 替换所有的匹配。
flags:可选参数,标志位,用于控制匹配方式

例如:

import re
pattern=r'1[34578]\d{9}'
string='中奖号码为787087876,联系电话为:13866666666'
result=re.sub(pattern,'138****6666',string)
print(result)

执行结果如下:

中奖号码为787087876,联系电话为:138****6666

7 分割字符串


split() 方法用于实现正则表达式分割字符串,并以列表的形式返回。其作用同字符串对象的·split() 方法类似,所不同的就是其分割字符由模式字符串指定。

语法格式如下:

re.split(pattern, string, [maxsplit], [flags])

maxsplit:分隔次数,maxsplit=1 分隔一次,默认为 0,不限制次数。

例如:

import re
str1='@你们 @我们 @他们'
pattern=r'\s*@'
list1=re.split(pattern,str1)# 用空格和@或者单独的@分割字符串
print('分割后的字符串为:')
for i in list1:
	print(i)

执行结果如下:

分割后的字符串为:

你们
我们
他们
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值