专栏首页崔庆才的专栏关于字符串处理,你真的全掌握了吗?

关于字符串处理,你真的全掌握了吗?

字符串处理是 Python 中最基本的操作之一了,但其实有些用法你真的可能没有注意到,这里分享一篇关于 Python 字符串处理的总结文章,希望对大家有帮助。

阅读本文大概需要 6 分钟。

本文要点

  • 字符串拼接
  • 拆分含有多种分隔符的字符串
  • 判读字符串 a 是否以字符串 b 开头或结尾
  • 调整字符串中文本的格式
  • 对字符串进行左,右,居中对齐
  • 删除字符串中不需要的字符

字符串拼接

实际场景:把列表中的数据拼接成一个字符串

解决方案:使用 str.join() 方法

>>> li = [3, 'cxk', 'kk', 'caibi']
>>> ''.join([str(i) for i in li])
'3cxkkkcaibi'

推荐使用生成器表达式,如果列表很大,可以节省很多内存空间

>>> ''.join(str(i) for i in li)
'3cxkkkcaibi'

拆分含有多种分隔符的字符串

实际场景:把某个字符串依据分割符号拆分不同的字段,该字符串包含多种不同的分隔符

s = "ab;fd/ft|fs,f\tdf.fss*dfd;fs:uu}fsd"

1.使用 Python 中的 split() 方法,由于 split 一次处理一个分隔符,例如:

>>> res = s.split(';')
>>> res
['ab', 'fd/ft|fs,f\tdf.fss*dfd', 'fs:uu}fsd']

所以我们需要根据字符串中的分隔符,依次分割,可以是 map 函数!

>>> list(map(lambda x: x.split("|"), res))
[['ab'], ['fd/ft', 'fs,f\tdf.fss*dfd'], ['fs:uu}fsd']]

结果变成了一个二维列表,而我们想要的结果是一维列表,怎么办?

创建一个临时列表保存结果。

>>> t = []
>>> list(map(lambda x: t.extend(x.split("|")), res))
[None, None, None]
>>> t
['ab', 'fd/ft', 'fs,f\tdf.fss*dfd', 'fs:uu}fsd']

结果符合我们的预期!接下来继续处理剩余的分隔符,重复动作,用 for 循环搞定!

最终代码如下:

def my_split(s, ds):
    res = [s]

    for d in ds:
        t = []
        list(map(lambda x: t.extend(x.split(d)), res))
        res = t   
    return res

将字符串和字符串中所有的分隔符传入,结果如下:

s = "ab;fd/ft|fs,f\tdf.fss*dfd;fs:uu}fsd"
print(my_split(s, ";/|,.}:*\t"))

运行结果:['ab', 'fd', 'ft', 'fs', 'f', 'df', 'fss', 'dfd', 'fs', 'uu', 'fsd']

2.使用 re 模块的中 split() 方法

re() 也给我们提供了 split() 方法,可以一次性分隔字符串!

import re

s = "ab;fd/ft|fs,f\tdf.fss*dfd;fs:uu}fsd"
print(re.split('[;/|,.}:*\t]', s))

结果一致,是不是很简单粗暴!

判读字符串 a 是否以字符串 b 开头或结尾

实际场景:比如某目录下有一系列文件:

编写程序给其中所有 .txt 文件和 .py 文件加上用户可执行权限

解决方案:

使用字符串 str.startswith() 和 str.endswith()

找出以 .txt 和 .py 结尾的文件,其接受一个元组

>>> import os
>>> os.listdir(".")
['app', 'config', 'requirements.txt', 'run.py', '__pycache__', 'gunicorn.conf.py', 'chromedriver', 'login_after2.png', 'readme.txt', 'slide.png', 'test.py', 'logs', 'chrome-linux.zip', 'gunicorn.pid', 'asgi.py', 'chrome-linux']

>>> [name for name in os.listdir(".") if name.endswith((".txt", ".py"))]
['requirements.txt', 'run.py', 'gunicorn.conf.py', 'readme.txt', 'test.py', 'asgi.py']

调整字符串中文本的格式

实际案列:例如在日志文件中,其中日期格式为'yyyy-mm-dd':

我们想把其中的日期改为美国日期格式'mm/dd/yyyy'.比如 2019-06-12 改成 06/12/2019 格式

解决方案:使用 re 中的 sub() 方法做字符串替换

利用正则表达式中的捕获组,捕获每个部分的内容,然后在替换在替换的字符串中调整各个捕获组的顺序!

代码如下:

import re

with open("info.log", "r", encoding="utf-8") as f:
    file = f.read()

print(re.sub('(\d{4})-(\d{2})-(\d{2})', r'\2/\3/\1', file))

捕获组中每组需要用括号括起来,然后默认从左至右分为组1, 组2…

下一个参数是我们要替换的格式,用 1,2,3 分别表示组1, 组2…

运行结果如下:

对字符串进行左,右,居中对齐

解决方案:

1.使用字符串中的 str.ljust(), str.rjust(), str.center() 进行左右居中对齐!

以上三种方法的基本用法:

>>> s = 'abc'
>>> s.ljust(20, '=')
'abc================='
>>> s.ljust(20)
'abc           '

三种方法都可以设置默认填充值

2.使用内置的 format() 方法

>>> format(s, ">20")
'                 abc'
>>> format(s, "<20")
'abc                 '
>>> format(s, "^20")
'        abc         '

删除字符串中不需要的字符

实际案例

  1. 过滤掉用户输入中前后多余的空白字符:“    nick2008@gmail.com    ”
  2. 过滤掉某 windows 下编辑文本中的 “\r” :“hello world \r\n”
  3. 去掉文本中的 unicode 组合符号(音调):nǐ hǎo mā

解决方案

  • 使用 str.strip(), str.lstrip(), str.rstrip() 方法去掉字符串两端字符
  • 使用 str.replace() 或者正则中的 re.sub()
  • 使用字符串中 str.translate() 方法,可以同时删除多个不同的字符

本文分享自微信公众号 - 进击的Coder(FightingCoder)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-06-24

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 广告小程序后端开发

    玩蛇的胖纸
  • 【科普】什么是协程 ?

    今天要讲的这个东西说实话,我也是今天才知道,一个我们大多数人可能从来都没用过的语法,哪就是传说中的【协程】,英文表达是 Coroutine。

    周三不加班
  • Python 抓取微信公众号账号信息

    搜狗微信搜索提供两种类型的关键词搜索,一种是搜索公众号文章内容,另一种是直接搜索微信公众号。通过微信公众号搜索可以获取公众号的基本信息及最近发布的10条文章,今...

    一墨编程学习
  • python3 paramiko 远程执行 ssh 命令、上传文件、下载文件

    在win10的系统下,本来想要python3直接调用ansible库进行远程执行的,但是很可惜,ansible是基于linux系统的ssh服务进行远程调用,不太...

    Devops海洋的渔夫
  • Leetcode 【200、695】

    求二维矩阵中由 '1' 连通的岛屿个数(上下左右有 '1' 视为连通)。很明显用回溯法(DFS)求解。 (1)在递归回溯的函数外部,遍历二维矩阵,如果某个位置...

    echobingo
  • 10 行Python 代码,实现 AI 目标检测技术,真给力!

    看完了代码,下面容我们聊聊目标检测背后的技术背景,并解读这10行Python代码的由来和实现原理。

    一墨编程学习
  • Leetcode 【950、969】

    这道题有些脑筋急转弯。正着看过程没有思路,但是倒着看可以发现规律:比如牌组中有 [11,17,13],现在要把 7 加进去,变成 [7,13,11,17],可以...

    echobingo
  • 如果有人问你Python爬虫抓取技术的门道,请叫他来看这篇文章

    web是一个开放的平台,这也奠定了web从90年代初诞生直至今日将近30年来蓬勃的发展。然而,正所谓成也萧何败也萧何,开放的特性、搜索引擎以及简单易学的html...

    一墨编程学习
  • pipenv的使用

    打开虚拟环境的python路径 ,进入 vim .project/Pipfile 修改url后的网址即可 清华 https://pypi.tuna.tsi...

    98k
  • Leetcode 【495、835】

    抛开移动的过程只看移动完成的结果。记图片左上角为顶点 (0, 0),正方形边长为 N,要使得两张图片有重叠,那么其中一张图片移到的某一点 (x, y) 一定与另...

    echobingo

扫码关注云+社区

领取腾讯云代金券