前言:
正则表达式在敏感词过滤,手机、邮箱、密码验证以及爬虫方面使用比较广,在编程过程中可以使用网上已有的正则表达式。首先我们要能看懂正则表达式,才能合理的运用。
附上:正则表达式在线测试
原子
原⼦:组成正则表达式的最⼩单位,任何字符都可以
原⼦ | 含义 | 原子 | 含义 |
\d | 0-9中任何⼀个字符 | \D | ⾮0-9中的任何⼀个字符 |
\w | 0-9a-zA-Z的中任何⼀个字符 ] | \W | ⾮0-9a-zA-Z_的中任何⼀个字符,也可以是中文 |
\s | \n\r\t 空格 | \S | ⾮\n\r\t 空格中任何⼀个字符 |
. | 代表除\n之外的任何字符 | [] | ⾃⼰创建的原⼦表,[0-4]代表0-4中任何⼀个字符 |
\b | 词边界 | \B | ⾮词边界 |
\A | 字符串开始 | \z | 字符串的结尾 |
^ | ⾏⾸;在原⼦表中表示排除 | [^] | 排除原⼦表中的字符 |
$ | ⾏结尾 | - | 表示域,0-9就表示0 到9所有数字字符 |
[\u4e00-\u9fa5] | 匹配纯中⽂ |
量词
量词 量词能够增强原⼦的描述能⼒
量词 | 含义 | 量词 | 含义 |
---|---|---|---|
{} | 重复前⼀个原⼦的次数 | * | 重复0次或多次 |
{m} | 重复前⼀个原⼦的m次 | + | ⾄少出现1次 |
{m,n} | 重复前⼀个原⼦的最少m次,最多n次 | ? | 出现0次或1次 |
{m,} | 重复前⼀个原⼦的最少m次 | *? +? | 匹配0次 匹配一次 |
() | 改变优先级 | x|y | 匹配x或者匹配y |
模式修正符
修正符 | 含义 | 修正符 | 含义 |
---|---|---|---|
re.S | 使.匹配所有字符 | re.I | 不区分大小写 |
re.L | 本地化识别 | re.M | 多行匹配 |
re.U | 根据Unicode字符集解析字符,会影响\b、\B、\w、\W |
正则常用方法
1、match(pattern,string,flags=0)
功能:从字符串起始位置匹配⼀个模式,如果不是从起始位置匹配则返回None
参数:patter 正则表达式
string 要匹配的字符串
flag 模式修正符
返回值: 匹配成功返回⼀个Match object,失败返回None
print(re.match(r"1(3|5)\d{9}$","13567534535"))
# 结果:<_sre.SRE_Match object; span=(0, 11), match='13567534535'>
2、search(pattern, string, flags=0)
功能:顺序扫描字符串,找到第⼀个匹配项结束(从左向右)
参数: patter 正则表达式
string 要匹配的字符串
flag 模式修正符
返回值:匹配成功,返回match object,否则返回None
res = re.search(r"hello","sfsdfsdfsddhellosdfffdhello")
3、group() groups() span()
只有match 和search可以使用
# 无命名组
res = re.search(r'(\d{3,4})-(\d{7,8})',"010-2343534")
print(res.group(1))
print(res.group(2))
print(res.groups())
# 命名组 (?P<name>\w+) ?P<组名>
res = re.search(r"show/(?P<name>\w+)","show/cuiccc")
print(res.group('name'))
print(res.group(1))
"""
结果:
010
2343534
('010', '2343534')
cuiccc
cuiccc
"""
4、findall(pattern, string, flags=0)
功能:扫描整个字符串,并返回结果列表
参数:patter: 匹配的正则表达式
string: 要匹配的字符串
flags:模式修正符
返回值:如果匹配成功返回⼀个列表,包含了所有匹配项,失败返回空列表
res = re.findall(r"xx","sdfsdxxfdgdxsxxdfsxx")
print(res)
# 结果:['xx', 'xx', 'xx']
5、split(pattern, string,maxsplit=0, flags=0)
功能:⽤模式串做分隔符,将字符串分隔,返回分隔列表,如果模式加上括号,则分隔符会被保留
参数:patter: 匹配的正则表达式
string: 要匹配的字符串
maxsplit 匹配次数,0不限制次数
flags:模式修正符
返回值:成功返回⼦串列表,否则返回空列表
# 从键盘上输入三个数求和
data = input("请输入三个整数,用逗号或空格做分隔符:")
data = re.split(r"[,, ]+",data)
data = [int(value) for value in data]
print(sum(data))
6、sub(pattern, repl, string, count=0) subn类似
功能:在⽬标字符串中以正则表达式的规则匹配字符串,再把他们替换成指定的字符串。可以指定替换的次数,如果不指定,替换所有的匹配字符串
参数:
pattern: 正则表达式(规则)
repl: 指定的⽤来替换的字符串
string: ⽬标字符串
count: 最多替换次数
区别:前者返回⼀个替换后的字符串,后者返回⼀个元组
# 千位数
str1 = "12345645768"
def replace(obj):
pos = obj.span()[1]
if pos % 3 == 0:
return obj.group(0)+','
else:
return obj.group(0)
res = re.sub(r'\d',replace,str1[::-1])
print(res.strip(",")[::-1])
# 结果:12,345,645,768
7、compile(pattern, flags=0)
功能:将正则表达式模式编译成正则表达式对象,其 match() 和 search() ⽅法可⽤于匹配
参数:pattern 模式
flags 模式修饰符
# 正则对象 只验证一次,后面直接调用
obj = re.compile(r"^\d{3,4}-\d{7,8}$")
print(obj.match("233-23345345"))
# 结果:<_sre.SRE_Match object; span=(0, 12), match='233-23345345'>