绝了!深度解析了1道华为Python笔试题,竟然可以学会12种Python里正则表达式的用法

本文涉及的产品
云解析 DNS,旗舰版 1个月
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: 大厂笔试总结

大家好,这里是程序员晚枫。

今天用一道华为笔试题,带大家深入掌握一项Python技巧:正则表达式。

本文主要分为4个部分:题目解析、常用方法、专业方法、注意事项

一、题目解析

先来看一下题目。

看完题目,有以下2个解题思路:

  1. 纯手写:首先把输入的字符串,用0补全为8的倍数,然后遍历字符串,每8个组成一个新的字符。
  2. 使用内置方法和标准库:使用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:

    • 标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等

相关文章
|
13天前
|
Python
在Python中,可以使用内置的`re`模块来处理正则表达式
在Python中,可以使用内置的`re`模块来处理正则表达式
34 5
|
17天前
|
算法 Python
Python 大神修炼手册:图的深度优先&广度优先遍历,深入骨髓的解析
在 Python 编程中,掌握图的深度优先遍历(DFS)和广度优先遍历(BFS)是进阶的关键。这两种算法不仅理论重要,还能解决实际问题。本文介绍了图的基本概念、邻接表表示方法,并给出了 DFS 和 BFS 的 Python 实现代码示例,帮助读者深入理解并应用这些算法。
28 2
|
18天前
|
数据采集 Web App开发 iOS开发
如何使用 Python 语言的正则表达式进行网页数据的爬取?
使用 Python 进行网页数据爬取的步骤包括:1. 安装必要库(requests、re、bs4);2. 发送 HTTP 请求获取网页内容;3. 使用正则表达式提取数据;4. 数据清洗和处理;5. 循环遍历多个页面。通过这些步骤,可以高效地从网页中提取所需信息。
|
26天前
|
测试技术 开发者 Python
深入浅出:Python中的装饰器解析与应用###
【10月更文挑战第22天】 本文将带你走进Python装饰器的世界,揭示其背后的魔法。我们将一起探索装饰器的定义、工作原理、常见用法以及如何自定义装饰器,让你的代码更加简洁高效。无论你是Python新手还是有一定经验的开发者,相信这篇文章都能为你带来新的启发和收获。 ###
16 1
|
27天前
|
设计模式 测试技术 开发者
Python中的装饰器深度解析
【10月更文挑战第24天】在Python的世界中,装饰器是那些能够为函数或类“添彩”的魔法工具。本文将带你深入理解装饰器的概念、工作原理以及如何自定义装饰器,让你的代码更加优雅和高效。
|
1月前
|
XML 前端开发 数据格式
Beautiful Soup 解析html | python小知识
在数据驱动的时代,网页数据是非常宝贵的资源。很多时候我们需要从网页上提取数据,进行分析和处理。Beautiful Soup 是一个非常流行的 Python 库,可以帮助我们轻松地解析和提取网页中的数据。本文将详细介绍 Beautiful Soup 的基础知识和常用操作,帮助初学者快速入门和精通这一强大的工具。【10月更文挑战第11天】
60 2
|
1月前
|
数据安全/隐私保护 流计算 开发者
python知识点100篇系列(18)-解析m3u8文件的下载视频
【10月更文挑战第6天】m3u8是苹果公司推出的一种视频播放标准,采用UTF-8编码,主要用于记录视频的网络地址。HLS(Http Live Streaming)是苹果公司提出的一种基于HTTP的流媒体传输协议,通过m3u8索引文件按序访问ts文件,实现音视频播放。本文介绍了如何通过浏览器找到m3u8文件,解析m3u8文件获取ts文件地址,下载ts文件并解密(如有必要),最后使用ffmpeg合并ts文件为mp4文件。
|
11天前
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
39 2
|
1月前
|
缓存 Java 程序员
Map - LinkedHashSet&Map源码解析
Map - LinkedHashSet&Map源码解析
70 0
|
1月前
|
算法 Java 容器
Map - HashSet & HashMap 源码解析
Map - HashSet & HashMap 源码解析
57 0
下一篇
无影云桌面