1 字符


1.1 匹配单字符

1.1.1 普通字符

匹配单字符
python import re # 查取某一字符 print(re.findall(r'a', 'abc123efg')) # 查取区间内字符 print(re.findall(r'[abc]', 'abc123efg')) print(re.findall(r'[a-e]', 'abc123efg')) # 查取区间外字符 print(re.findall(r'[^abc]', 'abc123efg')) print(re.findall(r'[^a-e]', 'abc123efg')) python ['a'] # [] ['a', 'b', 'c'] ['a', 'b', 'c', 'e'] # [^] ['1', '2', '3', 'e', 'f', 'g'] ['1', '2', '3', 'f', 'g']

1.1.2 特殊字符(\)

字符 等效 说明
\d [0-9] 所有数字
\D [^0-9] 所有非数字
\w 所有中文、下划线、数字、英文;
即不包括特殊字符#$%^&和空白字符
\W 所有特殊字符#$%^&和空白字符;
即不包括中文、下划线、数字、英文
\s 所有空白字符(空格`、制表符\t、换行\n`…)
\S 所有非空白字符(非空格`、制表符\t、换行\n`…)
. [^\n] 所有非换行字符\n
匹配单字符
python import re # 所有数字 print(re.findall(r'\d+', 'abc123efg')) print(re.findall(r'[0-9]+', 'abc123efg')) # 所有非数字 print(re.findall(r'\D+', 'abc123efg')) print(re.findall(r'[^0-9]+', 'abc123efg')) # 所有中文、下划线、数字、英文,即不包括特殊字符 print(re.findall(r'\w+','abc123efg\n牛')) # 所有下划线、数字、英文,即不包括中文和特殊字符 print(re.findall(r'[a-zA-Z0-9_]+','abc123efg\n牛')) # 所有非(中文、下划线、数字、英文),即特殊字符 print(re.findall(r'\W+','abc123efg\n牛')) # 所有非(下划线、数字、英文),即中文和特殊字符 print(re.findall(r'[a-zA-Z0-9_]+','abc123efg\n牛')) # 所有空白字符(空格、制表符、换行) print(re.findall(r'\s+','abc123efg\n牛')) # 所有非空白字符(非空格、制表符、换行) print(re.findall(r'\S+','abc123efg\n牛')) # 所有非换行字符 print(re.findall(r'.+','a\t1\nab\t12\n')) print(re.findall(r'[^\n]+','a\t1\nab\t12\n')) python # \d = [0-9] ['123'] ['123'] # \D = [^0-9] ['abc', 'efg\n牛'] ['abc', 'efg\n牛'] # \w ['abc123efg', '牛'] # [a-zA-Z0-9_] ['abc123efg'] # \W ['\n'] # [a-zA-Z0-9_] ['\n牛'] # \s ['\n'] # \S ['abc123efg', '牛'] ['a\t1', 'ab\t12'] ['a\t1', 'ab\t12']

1.2 匹配字符串

1.2.1 字符重复

匹配字符串
python import re # 重复指定次数(贪婪模式-默认) print(re.findall(r'[a-z]{2,5}', 'a1ab12abc123')) # 重复指定次数(非贪婪模式) print(re.findall(r'[a-z]{2,5}?', 'a1ab12abc123')) print(re.findall(r'[a-z]{2}', 'a1ab12abc123')) # 重复无限次,至少0次 print(re.findall(r'a[a-z]*', 'a1ab12abc123')) # 重复无限次,至少1次 print(re.findall(r'a[a-z]+', 'a1ab12abc123')) # 重复1次或0次 print(re.findall(r'a[a-z]?', 'a1ab12abc123')) python # {2,5} ['ab', 'abc'] # {2,5}? = {2} ['ab', 'ab'] ['ab', 'ab'] # * = {0,} ['a', 'ab', 'abc'] # + = {1,} ['ab', 'abc'] # ? = {01} ['a', 'ab', 'ab']

1.2.2 字符组合

匹配字符串
python import re # 通过单字符组合进行匹配 print(re.findall(r'ab', 'aababcabcdabcde')) print(re.findall(r'a[a-c]', 'aababcabcdabcde')) print(re.findall(r'a[a-c]*', 'aababcabcdabcde')) python ['ab', 'ab', 'ab', 'ab'] ['aa', 'ab', 'ab', 'ab'] ['aababcabc', 'abc']

1.3 边界匹配(^ $)

边界匹配
python import re # 开始标记 print(re.findall(r'^[a-z]', 'a1ab12abc123')) # 结尾标记 print(re.findall(r'\d+$', 'a1ab12abc123')) # 首尾标记 print(re.findall(r'^\w{12}$', 'a1ab12abc123')) python # ^ ['a'] # $ ['123'] # ^$ ['a1ab12abc123']

1.4 组

1.4.1 普通组

python import re # 组(不管怎么匹配,返回的都是组的值) print(re.findall(r'(abc)','aababcabcdabcde')) # 判断符合数量,都以单个组作为元素 print(re.findall(r'(abc){3}', 'aababcabcdabcde')) print(re.findall(r'(abc){2}', 'aababcabcdabcde')) print(re.findall(r'(abc){1}', 'aababcabcdabcde')) python ['abc', 'abc', 'abc'] [] ['abc'] ['abc', 'abc', 'abc']

1.4.2 打组

打组 — 通过组处理路径
python import re path = 'C:\Program Files (x86)\Steam\steamapps\common\MonsterHunterRise\ScreenShots' print(re.findall(r'common(.*)ScreenShots',path)[0].replace('\\','')) python MonsterHunterRise
python # 正则表达式中特殊标点要使用\转义字符; # 正则表达式中尽可能不要出现 r'common\\(.*)ScreenShots\\' 中 '\\(' 这种歧义;

1.4.3 分组

分组
python import re string = 'a1ab12abc123abcd1234' r = re.search(r'(ab\d+)(abc\d+)(abcd\d+)',string) # 返回正则匹配对象 print(r) # 返回匹配结果 print(r.group()) print(r.group(0)) # 返回第一组 print(r.group(1)) # 返回第二组 print(r.group(2)) # 返回第三组 print(r.group(3)) # 返回不存在的组 # print(r.group(4)) python <re.Match object; span=(2, 20), match='ab12abc123abcd1234'> # r.group()等同于r.group(0) ab12abc123abcd1234 ab12abc123abcd1234 ab12 abc123 abcd1234 报错:no such group

2 功能


2.1 查找

2.1.1 从开始匹配(match)

从开始位置匹配 — match
python import re print(re.match(r'a','a1ab12')) print(re.match(r'b','a1ab12')) print(re.match(r'd','a1ab12')) # 返回匹配的元素 print(re.match(r'a','a1ab12').group()) # print(re.match(r'b','a1ab12').group()) # 返回匹配元素的起始索引 print(re.match(r'a','a1ab12').span()) python <re.Match object; span=(0, 1), match='a'> None None # 无匹配则报错 a 报错:'NoneType' object has no attribute 'group' (0, 1)

2.1.2 首次匹配(search)

搜索整个字符串,返回首个字符串 — search
python import re print(re.search(r'a','a1ab12')) print(re.search(r'b','a1ab12')) print(re.search(r'd','a1ab12')) # 返回第一个满足条件的结果 print(re.search(r'a','a1ab12').group()) print(re.search(r'b','a1ab12').group()) # print(re.search(r'd','a1ab12').group()) python <re.Match object; span=(0, 1), match='a'> <re.Match object; span=(3, 4), match='b'> None a b 报错:'NoneType' object has no attribute 'group'

2.1.3 匹配列表(findall)

搜索整个字符串,返回列表 — findall
python import re print(re.findall(r'a','a1ab12')) print(re.findall(r'b','a1ab12')) print(re.findall(r'd','a1ab12')) python ['a', 'a'] ['b'] []

2.1.4 匹配模式(re)

匹配模式
python import re # 无视大小写搜索 print(re.findall(r'[a-z]+','a1AB2abc3', re.I)) # . 可以匹配 \n print(re.findall(r'.+','a\t1\nab\t12\n', re.S)) python # re.I ['a', 'AB', 'abc'] # re.S ['a\t1\nab\t12\n']

2.2 替换(sub)

2.2.1 普通替换

替换函数 — sub
python import re # 某一字符(串)/组替换为某一字符(串)/组 print(re.sub('a','A','a1ab12abc123')) # 许多字符(串)/组替换为某一字符(串)/组 print(re.sub('[a-c]','A','a1ab12abc123')) # 替换指定次数(缺省值为 0,表无数次) print(re.sub('a','A','a1ab12abc123',2)) python A1Ab12Abc123 A1AA12AAA123 # 参数 可超过可匹配数量 A1Ab12abc123

2.2.2 函数应用

使用函数替换
python import re # 删除指定字符串 def 函数1(string): pass # 替换指定字符串 def 函数2(string): return 'A' # 修饰指定字符串 def 函数3(string): return '#' + string.group() print(re.sub('a',函数1,'a1ab12abc123')) print(re.sub('a',函数2,'a1ab12abc123')) print(re.sub('a',函数3,'a1ab12abc123')) python # 替换为空字符串 1b12bc123 A1Ab12Abc123 #a1#ab12#abc123
示例 — 各位<5变0,≥5变9
python import re # 普通法 print(re.sub('[0-4]','0',re.sub('[5-9]','9','WP02118660'))) # 函数法 def 变身(string): string2 = string.group() if int(string2) >= 5: return '9' else: return '0' print(re.sub('[0-9]',变身,'WP02118660')) python WP00009990 WP00009990

2.3 分割(split)

分割函数 — split
python import re print(re.findall(r'a','abc123')) print(re.findall(r'b','abc123')) print(re.findall(r'd','abc123')) # 无视大小写搜索 print(re.findall(r'[a-z]+','abc123ABC456Abc789', re.I)) python ['a'] ['b'] [] # 适用于以上任一种方式 ['abc', 'ABC', 'Abc']

3 优质教程

优质教程
《孙兴华讲正则表达式》基于Python【已完结】_哔哩哔哩_bilibili Python正则表达式大全_普通网友的博客-CSDN博客_python正则表达式 Python正则表达式(一看就懂)_练习时长六年半的Programmer的博客-CSDN博客_python正则表达式