前言
这些得先知道:
. 点可代表一切非换行字符
\ 起转义作用
[...] 指代方括号中的任意字符
\d 指代数字0-9
\D 指代非数字
\s 指代一切空格,包括tab制表符、空格、换行等
\S 指代非空格
\w 指代大小写字母、数字和下划线
\W 指代非大小写字母、数字和下划线
* 匹配前面字符 >=0 次
+ 匹配前面字符1次及以上
? 匹配前面字符0次或1次
{m} 匹配m次
{m,n} 匹配m到n次
{m,} 至少匹配m次
一、re.compile()是用来优化正则的,它将正则表达式转化为对象,可以多次调用这个对象。往往配合其他函数使用,单独使用没意义。
# 参数:pattern,flags
# pattern: 一个字符串形式的正则表达式。
# flags : 可选,表示匹配模式,比如忽略大小写,多行模式等,具体参数为。
"""
1).re.I (IGNORECASE): 忽略大小写
2).re.M (MULTILINE): 多行模式,改变'^'和'$'的行为
3).re.S (DOTALL): 点任意匹配模式,改变'.'的行为
4).re.L (LOCALE): 使预定字符类 \w \W \b \B \s \S 取决于当前区域设定
5).re.U (UNICODE): 使预定字符类 \w \W \b \B \s \S \d \D 取决于unicode定义的字符属性
6).re.X (VERBOSE): 详细模式。这个模式下正则表达式可以是多行,忽略空白字符,并可以加入注释
"""
reg_0 = re.compile("[\d]") # 同:reg_0 = re.compile("\d")
reg_1 = re.compile("[abc]") # reg_1 = re.compile("abc") 不加[]是错误的写法。
reg_2 = re.compile("[abc]", re.I)
reg_3 = re.compile(r"""a
\d * #小数部分""", re.X) # 避免一行写不下,""""""可以实现换行哟。
二、re.sub() 实现比普通字符串的replace更加强大的“替换”功能。
# 参数:pattern, repl, string, count=0, flags=0
# pattern,表示正则中的模式字符串。
# repl,replace的意思,即pattern将被处理成的结果。
# string,表示被处理的字符串。
# count,表示是要替换的最大次数,必须是非负整数,该参数默认为0,即所有的匹配都会被替换。
# flags,表示编译时用的匹配模式(如忽略大小写、多行模式等),数字形式,默认为0。
str_1 = "a123bc、a456bc、A789BC,.!~"
result0 = re.sub(reg_0, "", str_1) # 输出:abc、abc、ABC,.!~
result1 = re.sub(reg_1, "", str_1) # 输出:123、456、A789BC,.!~
result2 = re.sub(reg_2, "", str_1) # 输出:123、456、789,.!~
result2_ = re.sub(reg_2, "", str_1, count=2) # 输出:123c、a456bc、A789BC,.!~
result3 = re.sub(reg_3, "", str_1) # 输出:bc、bc、A789BC,.!~
print(result0)
print(result1)
print(result2)
print(result2_)
print(result3)
再举一些例子:
reg_0 = re.compile("\d") # 用"",可以理解为.replace()
str_1 = "a123bc、a456bc、A789BC,.!~"
result0 = re.sub(reg_0, "", str_1)
print(result0) # abc、abc、ABC,.!~
reg_0 = re.compile("\dbc") # 同上
str_1 = "a123bc、a456bc、A789BC,.!~"
result0 = re.sub(reg_0, "", str_1)
print(result0) # a12、a45、A789BC,.!~
reg_0 = re.compile("[\dbc]") # 注意,这里加了[]。
str_1 = "a123bc、a456bc、A789BC,.!~"
result0 = re.sub(reg_0, "", str_1)
print(result0) # a、a、ABC,.!~
# 多字符替换,用‘|’隔开。
reg_0 = re.compile("\d|bc")
str_1 = "a123bc、a456bc、A789BC,.!~"
result0 = re.sub(reg_0, "", str_1)
print(result0) # a、a、ABC,.!~
# 多字符替换,用‘|’隔开。
reg_0 = re.compile("[\d|、]")
str_1 = "a123bc、a456bc、A789BC,.!~"
result0 = re.sub(reg_0, "", str_1)
print(result0) # abcabcABC,.!~
三、re.split() 实现比普通字符串的split更加强大的“切分”功能。
# 参数:pattern, string, maxsplit=0, flags=0
# pattern,表示正则中的模式字符串。
# string,表示被处理的字符串。
# maxsplit,最多切分次数,默认为0,表示全部切开。
# flags,表示编译时用的匹配模式(如忽略大小写、多行模式等),数字形式,默认为0。
str_1 = "a123bc、a456bc、A789BC,.!~"
reg_0 = re.compile("([、])") # 保留分割符号‘、’。
reg_1 = re.compile("(?:[、])") # 不保留分割符号‘、’。
result0 = re.split(reg_0, str_1) # 输出:['a123bc', '、', 'a456bc', '、', 'A789BC,.!~']
result1 = re.split(reg_1, str_1) # 输出:['a123bc', 'a456bc', 'A789BC,.!~']
print(result0)
print(result1)
# 多字符切分,用‘|’分开。
a = 'abc,123;αβγ。'
result1 = re.split(",|;|。", a) # ['abc', '123', 'αβγ', '']
result2 = re.split("c,1|3;α|。", a) # ['ab', '2', 'βγ', '']
四、re.findall()
a = 'abc123ABC(123)'
reg = re.compile('123')
result = re.findall(reg, a)
print(result) # ['123', '123']
a = 'abc123ABC(123)'
reg = re.compile('123|abc')
result = re.findall(reg, a)
print(result) # ['abc', '123', '123']
a = 'abc123ABC(123)'
reg = re.compile('[123]')
result = re.findall(reg, a)
print(result) # ['1', '2', '3', '1', '2', '3']
# 匹配.*前后字符间的所有内容,包括符号本身;如果加上?,是非贪婪匹配,不加是贪婪匹配.
# 注意:中文括号不需要转义,但是英文小括号(左右)、中括号(左)、大括号(左)需要转义.
a = 'abc[123]A(BC(123)789)'
reg = re.compile('\(.*?\)|\[.*?]') # 最小匹配
result = re.findall(reg, a)
print(result) # ['[123]', '(BC(123)']
a = 'abc[123]A(BC(123)789)'
reg = re.compile('\(.*\)|\[.*?]') # 贪婪匹配
result = re.findall(reg, a)
print(result) # ['[123]', '(BC(123)789)']