@[toc]
1. 写作背景
对一个文档中的电话号码进行提取,如果一个电话字符串满足多种匹配格式,则优先保留字符长度最长的电话。
2. 要进行匹配的文本
3. 初始代码
# 正则表达式列表
tel_complile = [
'\d\.\d{3}\.\d{3}\.\d{4}',
'\d{3}\.\d{3}\.\d{4}'
]
# 正则表达式匹配结果
templist = []
for i in tel_complie:
templist.append(re.findall(i, text))
templist = [ for i in tel_complile]
# 匹配结果的字符串长度
x = []
for index, i in enumerate(templist):
if len(i) == 0:
x.append(0)
else:
x.append(len(i[0]))
# 得到 tel
tel_li = []
for index, i in enumerate(x):
if i == max(x):
tel_li .append(templist[index][0])
tel = tel_li[0]
4. 修改后的代码
可以看到,上面的代码还是挺多的,是不是有点心烦,下面使用列表推导式和三目运算来改进一下:
输出结果
# 正则表达式列表
tel_complile = [
'\d\.\d{3}\.\d{3}\.\d{4}', # 用于匹配 1.111.111.1111格式的 tel
'\d{3}\.\d{3}\.\d{4}' # 用于匹配 111.111.1111格式的 tel
]
# 正则表达式匹配结果
templist = [re.findall(i, text) for i in tel_complile]
# 匹配结果的字符串长度
x = []
for i in templist:
x.append(0) if len(i) == 0 else x.append(len(i[0]))
# 获取 tel
tel = [templist[index][0] for index, i in enumerate(x) if i == max(x)][0]
5. 输出结果
6. 总结
我个人认为 ==代码在考虑好性能(内存占用)与可读性(注释凝练易懂)后,可以尽情追求精简== 。当然,代码的精简并不是一开始就能做到的,而往往是满足了需求后再回头进行改进的,希望本篇能对大家有所启发~