华为笔试题解析:1道题竟然包含12 种Python正则表达式用法,真是绝了!
今天用一道华为笔试题,带大家深入掌握一项 Python 技巧:正则表达式。
本文主要分为 4 个部分:题目解析、常用方法、专业方法、注意事项
一、题目解析
先来看一下题目。
看完题目,有以下 2 个解题思路:
- 纯手写:首先把输入的字符串,用 0 补全为 8 的倍数,然后遍历字符串,每 8 个组成一个新的字符。
- 使用内置方法和标准库:使用 str 的内置方法,用 0 补全右侧,然后使用正则每 8 个字符进行匹配。
1、思路 1:纯手写
def cut_8ch(str):
if len(str) < 8:
str = str.ljust(8, '0')
elif len(str) > 8:
if (len(str) % 8) != 0:
width = len(str) + (8 - len(str) % 8)
str = str.ljust(width, '0')
str2List = []
i = 0
while i < len(str):
if (i + 8) < len(str):
str2List.append(str[i:i+8])
else:
str2List.append(str[i:len(str)])
break
i = i + 8
return str2List
output = []
tmp = input('请输入字符串-->>').strip()
output.append(cut_8ch(tmp))
for x in output:
for y in x:
print(y)
2、思路 2:使用内置方法和标准库
import re
str = input('请输入字符串-->>')
if len(s) % 8 != 0:
s = s.ljust(len(s) + (8 - len(s) % 8), str(0))
res = re.findall('.{8}', s)
[print(r) for r in res]
很明显,思路 2 实现起来,逻辑更清晰,代码更简洁。原因在哪里呢?
今天我们重点讲一下 re 模块的使用。 关于 str 的所有自带方法,如果大家想看的话,可以在评论区告诉我,我可以另写一个篇新的文章来介绍。
二、常用方法
按照惯例,我们对 Python 知识的解析,直接拿源码来研究。先看一下 python 源码里,re 模块提供的 12 个方法👇
findall 方法
找出所有符合条件的内容。
举例:
我们现在有一句话,里面有一些数字,我们想把这些数字都提取出来:程序员晚枫,今年 18
岁,家里存款 100
多,车有 0
辆,多谢各位的 10086
+ 个点赞
import re
str = '程序员晚枫,今年18岁,家里存款100多,车有0辆,多谢各位的10086+个点赞'
res = re.findall('[0-9]+',string=str)
print(res)
# 输出:['18', '100', '0', '10086']
split 方法
对字符串进行分割。
举例:
假如我们现在有一组字符串:程序员晚枫 5
程序员晚枫 4
程序员晚枫 7
程序员晚枫,其中混进了一些无规律的数字:5、4、7,这次我们想根据这些数字,把这个字符串分割。
import re
str = '程序员晚枫5程序员晚枫4程序员晚枫7程序员晚枫'
res = re.split(pattern='[0-9]',string=str)
print(res)
# 输出:['程序员晚枫', '程序员晚枫', '程序员晚枫', '程序员晚枫,']
sub 方法
可以替换字符串中的内容。
举例:
假如我们现在有一组字符串:程序员晚枫 5
程序员晚枫 4
程序员晚枫 7
程序员晚枫,其中混进了一些无规律的数字:5、4、7,我们想根据这些数字,替换成逗号:,
。
import re
str = '程序员晚枫5程序员晚枫4程序员晚枫7程序员晚枫,'
res = re.sub(pattern='[0-9]', repl=',', string=str, count=0)
print(res)
# 输出:程序员晚枫,程序员晚枫,程序员晚枫,程序员晚枫,
# -----
# 参数1:pattern:表示正则中的模式字符串。
# 参数2:repl:就是replacement,表示被替换的字符串,可以是字符串也可以是函数。
# 参数3:string:表示要被处理和替换的原始字符串
# 参数4:count:可选参数,表示是要替换的最大次数,而且必须是非负整数,该参数默认为0,即所有的匹配都会被替换;
match 方法
re.match () 必须从字符串开头匹配!
举例:
match 方法,可以帮我们匹配出这段文字中的英文字母,"CoderWanFeng,加好友,联系程序员晚枫"
import re
text = "CoderWanFeng,加好友,联系程序员晚枫"
res = re.match("[a-zA-Z]+", text)
print(res) # 查看是否匹配到结果
print(res.group()) # 取出匹配的内容
fullmatch 方法
fullmatch 见名知义:只有在给定的字符串全部匹配时,才返回正确。
举例:
匹配用户输入的电话号码是否都是数字 + 符合 11 位。
import re
input = "19512345678"
pattern = "[0-9]+"
print(re.fullmatch(pattern, input))
print(re.fullmatch(pattern,input).group())
search 方法
查找字符串中是否有符合条件的内容。
import re
str = "程序员晚枫"
# search 字符串第一次出现的位置
print(re.search("晚", str))
# 输出:<re.Match object; span=(3, 4), match='晚'>
三、专业方法
subn 方法
subn 和 sub 的方法类似,区别在于:subn () 方法返回一个元组,其中包含所有替换的总数以及新字符串。 看到 subn 方法我困惑了一下,它和 sub 的区别时什么?
看过源码👇才知道,区别就是那个 n。
import re
str = '程序员晚枫,程序员晚枫,程序员晚枫,程序员晚枫,'
res = re.subn(pattern='程序员晚枫', repl='点赞+关注', string=str, count=2)
print(res)
# 参数1:pattern:表示正则中的模式字符串。
# 参数2:repl:就是replacement,表示被替换的字符串,可以是字符串也可以是函数。
# 参数3:string:表示要被处理和替换的原始字符串
# 参数4:count:可选参数,表示是要替换的最大次数,而且必须是非负整数,该参数默认为0,即所有的匹配都会被替换;
# -----
# ('点赞+关注,点赞+关注,程序员晚枫,程序员晚枫,', 2)
finditer
这个方法返回的是一个迭代器。
import re
str = '程序员晚枫,今年18岁,家里存款100多,车有0辆,多谢各位的10086+个点赞'
res = re.finditer('[0-9]+',string=str)
print(res)
# 输出:<callable_iterator object at 0x000001C3E94D3F40>
compile
re.compile () 是用来优化正则的,它将正则表达式转化为对象,re.search (pattern, string) 的调用方式就转换为 pattern.search (string) 的调用方式,多次调用一个正则表达式就重复利用这个正则对象,可以实现更有效率的匹配。
如下列代码所示,re.compile 生成 pattern 后,依然需要调用 re 的方法。
import re
str = '程序员晚枫,今年18岁,家里存款100多,车有0辆,多谢各位的10086+个点赞'
reg = re.compile('[0-9]+')
res = reg.findall(string=str)
print(res)
# 输出:['18', '100', '0', '10086']
purge
如源码所说,这个方法主要是用来清楚缓存。
Python 标准库中唯一调用 re.purge () 的位置是在测试中(特别是 test_re 模块的 re 单元测试和回归测试套件中的参考泄漏测试)。
template
这个方法我没找到怎么使用,欢迎大家在评论区补充。
escape
可以将字符串中所有可能被解释为正则运算符的字符进行转译。
re.escape('www.python-office.com')
# 输出:'www\\.python-office\\.com'
四、注意事项
- match 只能从头开始匹配
- match 和 search 的区别:search 可以从全部内容中匹配
- 所有的匹配方法,都有一个属性:flags:
- 标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等
转载于:Python自动化办公社区
原标题和URL:绝了!深度解析了1道华为Python笔试题,竟然可以学会12种Python里正则表达式的用法 - Python自动化办公社区的个人空间 - OSCHINA - 中文开源技术交流社区
相关文章
- 二级Python选择题_二级python选择题题库
- pycharm查找替换快捷键_python查找指定字符串并替换
- Pycharm中调用kinect_python中的pandas库
- python进制转换函数-Python中进制转换函数的使用
- python的进制转换器,Python进制转换[通俗易懂]
- 哪些软件是python编写出来的_用Python编程需要什么软件?
- Ubuntu16.04系统查看已安装的python版本,及Python2与Python3之间切换
- Python字符串操作之字符串分割与组合「建议收藏」
- python中sqrt函数用法_Python : sqrt() 函数
- 快速入门:Python简单实例100个(入门完整版)
- python 多线程测试_【Python】多线程网站死链检测工具
- 【说站】python默认字典是什么
- python自动化测试—Python自动化框架及工具
- 学python:使用python的pysam模块统计bam文件中spliced alignment的reads的数量
- 基于Python接口自动化测试框架+数据与代码分离实战(优化篇)
- 给程序加个进度条吧!1行Python代码,快速搞定~
- 网络工程师学Python-20-正则表达式
- python全栈开发-Day9 函数对象、函数嵌套、名称空间与作用域(装饰器基础)详解编程语言
- python在WIN下CMD运行中文乱码及python 2.x python 3.x编码问题详解编程语言
- Python __name__==’__main__’作用详解
- Python驱动Oracle数据库(python操作oracle)
- Python 调试技巧
- 太赞了!Python竟可以轻松实现音频格式无损转换
- python实现ftp客户端示例分享
- python实现随机密码字典生成器示例
- python实现的udp协议Server和Client代码实例
- 用python读写excel的方法