对于正则表达式,其实就四类应用正则匹配、正则查找、正则替换和正则切割。
正则匹配比较常规,掌握基本语法即可。本文将带你玩转正则查找、正则替换和正则切割的高端使用姿势。
在使用正则表达式之前,我们首先需要导入正则模块:
import re
正则的三板大斧
正则查找
示例1:查找所有连续的数字
s = ' taobao 123 google 456' re.findall("\d+", s)
结果:
['123', '456']
示例2:查找所有连续的中文内容
s = "<tr><td>4980</td><td>上行低速率</td><td>110</td><td>上行低速率</td></tr>" re.findall("[\u4E00-\u9FA5]+", s)
结果:
['上行低速率', '上行低速率']
示例3:找出英文文章中所有4个字母的单词:
s = "Clothes are so significant in our daily life that we can't live without them" re.findall(r"\b[a-z]{4}\b", s, re.I)
结果:
['life', 'that', 'live', 'them']
正则替换
示例1:删除文本行后面的注释
phone = "2004-959-559 # 这是一个电话号码" re.sub(r'#.*$', "", phone)
结果:
2004-959-559
示例2:删除电话号码所有非数字的内容
phone = "2004-959-559 # 这是一个电话号码" re.sub(r'\D', "", phone)
结果:
2004959559
示例3:给金额字符串添加万分符
s = """5305256725元 4220元 870元 7866369414527元 144995元 2069993310元 354070715448元 711元 2113046206元""" re.sub(r"(?<=\d)(?=(?:\d{4})+元)", ",", s)
结果:
53,0525,6725元 4220元 870元 7,8663,6941,4527元 14,4995元 20,6999,3310元 3540,7071,5448元 711元 21,1304,6206元
示例4:将重叠的字符替换成单个字符(zzzz->z)
将
"我我...我我...我要..要要...要要...学学学....学学...编编编...编程..程.程程...程...程"
转成:
"我要学编程"
s = "我我...我我...我要..要要...要要...学学学....学学...编编编...编程..程.程程...程...程" re.sub(r"(.)\1+", r"\1", s.replace(".", ""))
结果:
'我要学编程'
示例5:连续单词去重
例如:
the little cat cat is in the hat hat hat2, we like it.
其中 cat 和 hat 连接出现多次,要求处理后结果是:
the little cat is in the hat hat2, we like it.
s = "the little cat cat is in the hat hat hat2, we like it." re.sub(r"(\b\w+)(?:\s+\1\b)+", r"\1", s)
结果:
'the little cat is in the hat hat2, we like it.'
示例6:ip地址排序
s = "192.68.1.254 102.49.23.013 10.10.10.10 2.2.2.2 8.109.90.30" s = re.sub(r"(\d+)", r"00\1", s) s = re.sub(r"0*(\d{3})", r"\1", s) s = " ".join(sorted(s.split())) s = re.sub(r"0*(\d+)", r"\1", s)
结果:
'2.2.2.2 8.109.90.30 10.10.10.10 102.49.23.13 192.68.1.254'
示例7:将字符串中的所有连续数字翻倍
s = 'A23G4HFD567' re.sub('\d+', lambda m: str(int(m.group(0))*2), s)
结果:
'A46G8HFD1134
示例8:将字符串中的所有大于6的数字替换成9, 小于6的数字替换为0
s = 'AB837D5D4F7G8H7F8H56D4D7G4D3' re.sub('\d+', lambda m: '9'if int(m.group()) >= 6else'0', s)
结果:
'AB9D0D0F9G9H9F9H9D0D9G0D0'
示例9:给每个逗号分割的片段增加递增的数值编号
from itertools import count s = "张三,李四,王五,赵六,孙七,周八" numbers = count(1) re.sub("[^,,]+", lambda m: f"{next(numbers)}.{m.group()}", s)
结果: '1.张三,2.李四,3.王五,4.赵六,5.孙七,6.周八'
正则切割
示例1:需要切割出下面这个字符串的每个连续的字符串(含有不确定数量的空格和tab)
s = "FRN2004001 100 VCP772Z 417 BX 417 BX 181128307 CN10 1220 2000 5,004 EA 2020.03.30 45408263 L12 L12" re.split("\s+", s)
结果:
['FRN2004001', '100', 'VCP772Z', '417', 'BX', '417', 'BX', '181128307', 'CN10', '1220', '2000', '5,004', 'EA', '2020.03.30', '45408263', 'L12', 'L12']
示例2:需要取出其中所有的北京xx,即北京西、北京站、北京北、北京南站 和 北京东。
s = "北京西北京站北京北北京南站北京东" re.split("(?!^)(?=北京)", s)
结果:
['北京西', '北京站', '北京北', '北京南站', '北京东']
Python正则表达式速查表与实操案例
上面的的案例是不是看起来很高端,但却看不懂为什么这么写?
没有关系,江湖人称为明佬的【小小明】,给大家写了系统文档《Python正则表达式速查表与实操案例》
这个文档非常全面,不仅仅是学习正则的好文档,还是一份语法速查表,适用从小白到专家级别的正则玩家。
目录如下:
image-20210712204730109
第一部分就是正则语法的速查表,方便新手熟手快速查询正则语法。
第二部分详解了贪婪模式与非贪婪模式
第三部分专门将分组的规则
第四部分详解位置类的语法
第五部分详解了正则的各种模式
第六部分则是本文各类案例的详解
后面,则是一些的原理讲解,对写出好的正则有一定的帮助。
总之,在我看完这份文档后,个人觉得实在是牛逼,比其他公众号导出传的正则文档强了十倍百倍。然而这么高端的正则文档却很少人看到,所以我分享给大家,让大家也步入高阶数据处理的大门吧。
跟着小明哥学数据处理绝对有戏成为秒杀一大片公众号和专栏作者的高手。
也欢迎大家关注小明哥CSDN,学习更多干货知识,点击阅读原文即可转入。
如何获取文档呢?