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正则表达式 |