基本语法
通配符
反义
重复
贪心和非贪心
python正则表达式
re 模块包含了9个常量、12个函数、1个异常,介绍一下常用的常量和函数。,当然要导入这个模块,
import re
re模块常量
IGNORECASE
语法: re.IGNORECASE 或者简写 RE.I
作用:进行忽略大写匹配
# 大小写
def regexFlag():
"""演示re.I的使用"""
text = "adfac"
pattern = r"ADFAC"
print(f"默认模式:{re.findall(pattern, text)}")
print(f"忽略大小写 模式:{re.findall(pattern, text, re.I)}")
regexFlag()
默认模式:[]
忽略大小写 模式:['adfac']
ASCII
语法: re.ASCII 或简写为 re.A
作用: 顾名思义,ASCII表示ASCII码的意思,让 w, W, b, B, d, D, s 和 S 只匹配ASCII,而不是Unicode
# ASCII
def regexFlag():
"""演示re.A的使用"""
text = "ad你好fac"
pattern = r"w+"
print(f"Unicode:{re.findall(pattern, text)}")
print(f"ASCII:{re.findall(pattern, text, re.A)}")
regexFlag()
Unicode:['ad你好fac']
ASCII:['ad', 'fac']
DOTALL
语法: re.DOTALL 或简写为 re.S
作用: DOT表示.,ALL表示所有,连起来就是.匹配所有,包括换行符n。默认模式下.是不能匹配行符n的。
# re.S
def regexFlag():
"""演示re.S的使用"""
text = """威哥
最帅
"""
pattern = r".*"
print(f"默认模式:{re.findall(pattern, text)}")
print(f".匹配所有模式:{re.findall(pattern, text, re.S)}")
regexFlag()
默认模式:['威哥', '', ' 最帅', '', ' ', '']
.匹配所有模式:['威哥n 最帅n ', '']
MULTILINE
语法: re.MULTILINE 或简写为 re.M
作用: 多行模式,当某字符串中有换行符n,默认模式下是不支持换行符特性的,比如:行开头 和 行结尾,而多行模式下是支持匹配行开头的。
# re.M
def regexFlag():
"""演示re.M的使用"""
text = "威哥n最帅"
pattern = r"^最帅"
print(f"默认模式:{re.findall(pattern, text)}")
print(f"多行模式:{re.findall(pattern, text, re.M)}")
regexFlag()
默认模式:[]
多行模式:['最帅']
VERBOSE
语法: re.VERBOSE 或简写为 re.X
作用: 详细模式,可以在正则表达式中加注解!
# re.X
def regexFlag():
"""演示re.X的使用"""
text = "威哥最帅"
pattern = r"""^威哥 #人物
最帅 #形容词
"""
print(f"默认模式:{re.findall(pattern, text)}")
print(f"多行模式:{re.findall(pattern, text, re.X)}")
regexFlag()
默认模式:[]
多行模式:['威哥最帅']
re模块函数
查找一个匹配项
查找并返回一个匹配项的函数有3个:search
、match
、fullmatch
,分别是
search
: 查找任意位置的匹配项
match
: 必须从字符串开头匹配
fullmatch
: 整个字符串与正则完全匹配
text = "a威哥大帅哥,威哥大帅哥"
pattern = r"威哥大帅哥"
print(f"search: {re.search(pattern, text).group()}")
print(f"match: {re.match(pattern, text)}")
print(f"fullmatch: {re.fullmatch(pattern, text)}")
search: 威哥大帅哥
match: None
fullmatch: None
text = "威哥大帅哥,威哥大帅哥"
pattern = r"威哥大帅哥"
print(f"search: {re.search(pattern, text).group()}")
print(f"match: {re.match(pattern, text).group()}")
print(f"fullmatch: {re.fullmatch(pattern, text)}")
search: 威哥大帅哥
match: 威哥大帅哥
fullmatch: None
text = "威哥大帅哥"
pattern = r"威哥大帅哥"
print(f"search: {re.search(pattern, text).group()}")
print(f"match: {re.match(pattern, text).group()}")
print(f"fullmatch: {re.fullmatch(pattern, text).group()}")
search: 威哥大帅哥
match: 威哥大帅哥
fullmatch: 威哥大帅哥
查找多个匹配项
findall
: 从字符串任意位置查找,返回一个列表
finditer
:从字符串任意位置查找,返回一个迭代器
text = "a威哥大帅哥,威哥小帅哥"
pattern = r"威(哥)大(帅哥)"
print(f"findall: {re.findall(pattern, text)}")
print(f"finditer: {re.finditer(pattern, text)}")
findall: [('哥', '帅哥')]
finditer: <callable_iterator object at 0x000001BCF680A250>
分割
re.split(pattern, string, maxsplit=0, flags=0)
函数:用 pattern
分开 string
, maxsplit
表示最多进行分割次数, flags
表示模式,就是上面我们讲解的常量!
text = "a威哥大帅哥,威哥小帅哥,威哥小帅哥"
pattern = r","
print(f"split: {re.split(pattern, text,maxsplit=1,flags=re.I)}")
split: ['a威哥大帅哥', '威哥小帅哥,威哥小帅哥']
替换
re.sub(pattern, repl, string, count=0, flags=0)
函数参数讲解:repl替换掉string中被pattern匹配的字符, count表示最大替换次数,flags表示正则表达式的常量。
text = "a威哥大帅哥,威哥小帅哥,威哥小帅哥"
pattern = r","
repl = "、"
print(f"sub: {re.sub(pattern, repl, string = text,flags=re.I)}")
sub: a威哥大帅哥、威哥小帅哥、威哥小帅哥
推荐几个好用的网站
1. PHP, PCRE, Python, Golang and JavaScript
2. ziishaned/learn-regex
参考资料
- https://zhuanlan.zhihu.com/p/127807805
- https://zhuanlan.zhihu.com/p/26019553