深度解析python中的字符串和文本(一)

从今天开始,和大家一起学习python中的字符串和文本,本片博客适合有一定python基础的朋友阅读,目的在于灵活运用python中的各种方法,提高代码的健壮性和简洁性。

目录

一、前言

二、问题实例

1.使用多个界定符分割字符串

2.字符串开头或结尾匹配

3.使用shell通配符匹配字符串

4.字符串匹配和搜索

5.字符串的搜索和替换

三、结束语

一、前言

很多程序都会涉及到某些字符串和文本处理,不管是输入还是产出。接下来的几篇博客重点分享文本的操作处理,比如提取字符串,搜索,替换,解析等等

二、问题实例

1.使用多个界定符分割字符串

问题:给定一个含有不规则字符的字符串,要求将这个字符串分割

思路:正常情况下splite方法就可以解决百分之50的字符串分割。但是他只适用于单个规则的分割,如果字符串里面出现了不同规则的分隔符,就可以用我们的re模块并结合我们的正则表达式来解决。

代码如下:

import re
str1= 'asd ahsdj;iabi/ihfoi?akshd'
new_list = re.split(r'[;/?\s]',str1)
print(new_list)  # ['asd', 'ahsdj', 'iabi', 'ihfoi', 'akshd']

注意:re.splite接受两个参数,一个是正则规则,一个是字符串

思考:面试的时候也经常会问道。请说出re.findall、re.search、re.match的用法和区别

2.字符串开头或结尾匹配

问题:想通过匹配字符串的开头或者结尾来确定想要的字符串

思路:这个问题很简单,只需要用我们的startswich和endswich就能解决

代码实现:

list1= ['1.py','2.c','3.robot','4.txt','5.py','6.jpg']
for i in list1:
    if i.endswith(".py"):
        print(i)  # 1.py 5.py

思考:既然我们可以通过endswich找到我们想要匹配的字符串,那么是不是切片也可以解决此问题呢?

3.使用shell通配符匹配字符串

问题:请使用Unix Shell中常用的通配符(*.py,*.csv)去匹配文本字符串,改怎么解决

思路:fnmatch提供了两个方法,fnmatch、fnmatchcase。这两个方法即可解决此类问题

代码实现:

from fnmatch import fnmatch
names = ['20220402.txt','DH01.py','DH02.csv','DH5461.py']
new_names = [name for name in names if fnmatch(name,'DH*.py')]
print(new_names)  # ['DH01.py', 'DH5461.py']

注意:fnmatch接受两个参数,第一个是字符串,第二个是匹配字符串的shell规则。fnmatchcase原理同fnmatch

4.字符串匹配和搜索

问题:匹配和搜索特定的字符

思路:这里就是我刚才说到的面试题,find,findall,match,search的使用场景及区别。

代码实现:

texts = 'today is 2022/04/02,I am very happy because i know a new question in csdn 2022/05/31'
print(texts.find('csdn'))  # 56
datapat = re.findall(r'\d+/\d+/\d+',texts)
print(datapat)  # ['2022/04/02']
datapat1 = re.match(r'\d+/\d+/\d+',texts)
print(datapat1)  # None
datapat2 = re.search(r'\d+/\d+/\d+',texts)
print(datapat2)  # <re.Match object; span=(9, 19), match='2022/04/02'>

总结:通过以上结果。我自己做个自我总结,find返回的是匹配到的字符串出现位置的下标索引。

match的查找方式是从第一个元素开始查找,所以上述正则对他不起作用,返回none,search的查

找方式是找到一个就返回结果。findall的查找方式是找到所有符合当前正则规则的字符串。

5.字符串的搜索和替换

问题:给定一个字符串搜索并替换其中的内容

思路:python中的replace就能解决这个问题

代码实现:

text = 'hi ljj,nice to meet you,i think that today you must commit you homework,' \
       'beacause it is more than 2022/04/02' \
       'if you not ok,you will be punished'
new_text = text.replace('ljj','张三')
print(new_text)  
"""
hi 张三,nice to meet you,i think that today you must commit you homework,
beacause it is more than 2022/04/02
if you not ok,you will be punished
"""

延伸:replace确实可以解决大部分的字符串替换问题,那么如果需要修改有规律的字符串该怎么办呢,re模块中的sub即可解决这个问题

代码实现:

text = 'hi ljj,nice to meet you,i think that today you must commit you homework,' \
       'beacause it is more than 2022/04/02' \
       'if you not ok,you will be punished'
new_text = text.replace('ljj','张三')
print(new_text)
"""
hi 张三,nice to meet you,i think that today you must commit you homework,
beacause it is more than 2022/04/02
if you not ok,you will be punished
"""

new_data = re.sub(r'(\d+)/(\d+)/\d+',r'2022/05/02',text)
print(new_data)
"""
hi ljj,nice to meet you,i think that today you must commit you homework,
beacause it is more than 2022/05/02
if you not ok,you will be punished
"""

三、结束语

觉得还比较有用的小伙伴点赞收藏吧,持续更新中。如果文章中说的有问题的地方,还请大佬指正,欢迎大家和我交流编程相关的知识,也可以给小编提建议,每一位朋友的评论或者私信都会认真解答和讨论的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

戒酒的李白-Lisage

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值