Python3 正则表达式

常用的匹配模式在这里插入图片描述

正则表达式是一个特殊的字符序列,它能帮助你方便的检查一个字符串是否与某种模式匹配。
re 模块使 Python 语言拥有全部的正则表达式功能。

re.match函数

  re.match 尝试从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功的话,match()就返回none。

re.match(pattern, string, flags=0)
  • pattern 匹配的正则表达式
  • string 要匹配的字符串
  • flags 标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等。参见末尾:正则表达式修饰符 - 可选标志

匹配成功re.match方法返回一个匹配的对象,否则返回None。
我们可以使用group(num) 或 groups() 匹配对象函数来获取匹配表达式

  • 最常规的匹配
import re
str = 'Hello 123 4567 World'
print(len(str))				#输出str的长度
result = re.match('^Hello\s\d\d\d\s\d{4}\s\w\wrld$', str)
print(result)
print(result.group())
print(result.span())		#输出匹配到的字符串的位置
result =re.match('^Hello\s(\d\d\d)\s\d{4}\s(\w\wrld)$', str)
print(result.group(),'\ngroup(1)',result.group(1),'\ngroup(2)',result.group(2))#group(1)为正则表达式中第一个括号内的内容
print(result.span())
result = re.match('^Hello\s\d\d\d',str)		#只匹配Hello 123
print(result.group())
print(result.span())

运行结果

20
<re.Match object; span=(0, 20), match='Hello 123 4567 World'>
Hello 123 4567 World
(0, 20)
Hello 123 4567 World 
group(1) 123 
group(2) World
(0, 20)
Hello 123
(0, 9)
  • 泛匹配
import re
str = 'Hello 123 666 World_This is a Regex Demo'
result = re.match('^Hello.*Demo$', str)
print(result)
print(result.group())
print(result.span())
result = re.match('^Hello.*?6', str)
print('非贪婪方式匹配',result.group())
result = re.match('^Hello.*6', str)
print('贪婪方式匹配',result.group())

其中
.*  表示任意匹配除换行符(\n、\r)之外的任何单个或多个字符
.*? 使用非贪婪方式匹配任意的字符
运行结果

<re.Match object; span=(0, 40), match='Hello 123 666 World_This is a Regex Demo'>
Hello 123 666 World_This is a Regex Demo
(0, 40)
非贪婪方式匹配 Hello 123 6
贪婪方式匹配 Hello 123 666
  • 匹配目标
import re
str = 'Hello 123 4567 World'
print(len(str))				#输出str的长度
result = re.match('^Hello\s\d\d\d\s\d{4}\s\w\wrld$', str)
print(result)
print(result.group())
print(result.span())		#输出匹配到的字符串的位置
result =re.match('^Hello\s(\d\d\d)\s\d{4}\s(\w\wrld)$', str)
print(result.group(),'\ngroup(1)',result.group(1),'\ngroup(2)',result.group(2))#group(1)为正则表达式中第一个括号内的内容
print(result.span())

运行结果

Hello 123 4567 World 
group(1) 123 
group(2) World
(0, 20)

总结: 尽量使用泛匹配、使用括号得到匹配目标、尽量使用非贪婪模式、有换行符就用re.S

re.search函数

re.search 扫描整个字符串并返回第一个成功的匹配。

import re
str = 'Extra stings Hello 1234567 World_This is a Regex Demo Extra stings'
result = re.search('.*?(\d+).*?Demo', str)
#匹配多个数字
print(result)
print(result.group(1))

运行结果

1234567

总结:为匹配方便,能用search就不用match

re.findall函数

搜索字符串,以列表形式返回全部能匹配的子串。

import re
str = '123 456 abc 789 ddd sd 12d'
results = re.findall('\d+ ', str)
#匹配多个数字
print(results)
for result in results :
    print(result)

运行结果

['123 ', '456 ', '789 ']
123 
456 
789 
re.sub函数

替换字符串中每一个匹配的子串后返回替换后的字符串。

import re
str = '123 456 abc 789 ddd sd 12d'
result = re.sub('\d','0',str)
#把所有的数字替换成0
print(result)

运行结果

000 000 abc 000 ddd sd 00d
re.compile函数

将正则字符串编译成正则表达式对象。
将一个正则表达式串编译成正则对象,以便于复用该匹配模式。

import re
str = '''Hello 1234567 World_This
is a Regex Demo'''
pattern = re.compile('Hello.*Demo', re.S)
#匹配的字符串中存在换行符是使用re.S
result1 = re.match(pattern, str)
print('result1',result1)
result2 = re.match('Hello.*Demo', str, re.S)
print('result2',result2)

运行结果

result1 <re.Match object; span=(0, 40), match='Hello 1234567 World_This\nis a Regex Demo'>
result2 <re.Match object; span=(0, 40), match='Hello 1234567 World_This\nis a Regex Demo'>
正则表达式修饰符 - 可选标志
修饰符描述
re.I使匹配对大小写不敏感
re.L做本地化识别(locale-aware)匹配
re.M多行匹配,影响 ^ 和 $
re.S使 . 匹配包括换行在内的所有字符
re.U根据Unicode字符集解析字符。这个标志影响 \w, \W, \b, \B.
re.X该标志通过给予你更灵活的格式以便你将正则表达式写得更易于理解。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值