一文搞定 Python 字符串操作(上)

文章首发于微信公众号:可乐python说

前言

Python3 中有六个标准的数据类型,它们分别是数字(Number)、字符串(String)、列表(List)、元组(Tuple)、集合(Set)、字典(Dictionary)。

数据类型分类可变数据类型、和不可变数据类型,其中可变类型包括列表、字典、集合,不可变类型包括数字、字符串、元组。

本文主要介绍 Python 中字符串的内建函数,并配上相关代码,便于理解、吸收。


字符串简介

Python中的字符串使用单引号 '' 或双引号 "" 括起来,同时使用反斜杠 \ 转义特殊字符,实际工作当中,接触、处理最多的数据类型,莫过于字符串了。

下面使用两种方式定义字符串,两种方式均可

>>> single_str = 'a我是单引号括起来的字符串'
>>> type(single_str)      # type 查看数据类型
<class 'str'>

>>> double_str = "a我是双引号括起来的字符串"
>>> type(double_str)      # type 查看数据类型
<class 'str'>

字符串操作

我将字符串操作分为五大类,分别是通用类、英文单词类、判断类、编码类、以及其他类,今天先介绍一下通用类的相关操作。

通用类

  • replace(old, new [, max]),把 将字符串中的 old 替换成 new, max 为可选参数,若指定 max ,则替换 max 次。

    # 使用语法:str.replace(old, new[, max])
    # 用法一:不指定 max ,替换所有
    >>> double_str = "my name is kele kele"
    >>> double_str.replace("kele", "xuebi")
    'my name is xuebi xuebi'
    
    # 用法二:指定 max ,替换 max 次
    >>> double_str.replace("kele", "xuebi", 1)
    'my name is xuebi xuebi'
    
  • split(str="", num=string.count(str)),以 str 为分隔符截取字符串,默认为所有的空字符,包括空格、换行\n、制表符\t等。若指定 num ,则截取出 num+1 个子字符串,返回包含所有字符串的列表。

    # 使用语法:str.split(str="", num=string.count(str))
    # 用法一:不指定 num ,截取所有
    >>> double_str = "mynameiskelekelea"
    >>> double_str.split("e")
    ['mynam', 'isk', 'l', 'k', 'l', 'a']
    
    # 用法二:指定 num ,截取 num 次
    >>> double_str.split("e", 1)
    ['mynam', 'iskelekelea']
    
  • splitlines([keepends]),按照行('\r', '\r\n', \n')分隔,返回一个包含各行作为元素的列表,参数 keepends 默认为 False,不包含换行符,如果为 True,则保留换行符。

    # 使用语法:str.splitlines([keepends])
    # 用法一:不指定 keepends,默认为 False
    >>> double_str = "my name\nis ke\rle\r\n"
    >>> double_str.splitlines()
    ['my name', 'is ke', 'le']
    
    # 用法一:指定 keepends 为 True, 保留切割符
    >>> double_str.splitlines(True)
    ['my name\n', 'is ke\r', 'le\r\n']
    
  • len(string),返回字符串的长度。

    # 使用语法:len(string)
    >>> double_str = "my name is kele"
    >>> len(double_str)
    15 
    
  • find(str, beg=0, end=len(string)),检测 str 是否包含在字符串中,若指定 beg 和 end ,则在指定范围内检测,若包含则返回第一次出现的索引值,否则返回 -1。

    # 使用语法:str.find(str, beg=0, end=len(string))
    >>> double_str = "my name is kele"
    >>> double_str.find("h")
    -1
    >>> double_str.find("e")
    6
    # 指定范围
    >>> double_str.find("i",0,5)
    -1
    
  • rfind(str, beg=0,end=len(string)),与 find() 函数类似,但它是从右边开始查找,返回字符串最后一次出现的索引值。

    # 使用语法:str.rfind(str, beg=0, end=len(string))
    >>> double_str = "my name is kele"
    >>> double_str.rfind("h")
    -1
    >>> double_str.rfind("e")
    14
    # 指定范围
    >>> double_str.rfind("i",0,5)
    -1
    
  • index(str, beg=0, end=len(string)),与 find() 函数类似,但如果 str 不在字符串中会报如下错误。

    # 使用语法:str.index(str, beg=0, end=len(string))
    >>> double_str = "my name is kele"
    >>> double_str.index("h")      # 元素不在字符串中回报错
    Traceback (most recent call last):
      File "<input>", line 1, in <module>
    ValueError: substring not found
    
    >>> double_str.index("e")
    6
    # 指定范围
    >>> double_str.index("a",0,5)
    4
    
  • rindex( str, beg=0, end=len(string)),类似于 index(),不过是从右边开始,返回字符串最后一次出现的索引值。

    # 使用语法:str.rindex(str, beg=0, end=len(string))
    >>> double_str = "my name is kele"
    >>> double_str.rindex("h")      # 元素不在字符串中回报错
    Traceback (most recent call last):
      File "<input>", line 1, in <module>
    ValueError: substring not found
    
    >>> double_str.rindex("e")
    14
    # 指定范围
    >>> double_str.rindex("a",0,5)
    4
    
  • count(str, beg= 0,end=len(string)),返回 str 在 string 中出现的次数,若指定 beg 或者 end 参数,则返回在指定范围内 str 出现的次数。

    # 使用语法:str.count(str, beg=0, end=len(string))
    >>> double_str = "my name is kele"
    >>> double_str.count("h")
    0
    >>> double_str.count("e")
    3
    # 指定范围
    >>> double_str.count("e",0,7)
    1
    
  • lstrip([chars]),只处理字符串句首的空格或指定字符,其他位置忽略。

    # 使用语法:str.lstrip([chars\)
    # 处理句首空格
    >>> double_str = "  句首 有两个空格"
    >>> double_str.lstrip()     
    '句首 有两个空格'
    
    # 处理句首指定字符
    >>> double_str = "句首句首有一个空格"
    >>> double_str.lstrip("句首")     
    '有一个空格'
    
  • rstrip([chars]),处理字符串末尾的空格或指定字符,其他位置忽略 。

    # 使用语法:str.rstrip([chars])
    # 处理句尾空格
    >>> double_str = "句子末尾 有两个空格  "
    >>> double_str.rstrip()     
    '句子末尾 有两个空格'
    
    # 处理句尾其他字符
    >>> double_str = "句尾有一个空格空格"
    >>> double_str.rstrip("空格")     
    '句尾有一个'
    
  • strip([chars]), 处理字符串两端的空格或指定字符,可视为 lstrip() 和 rstrip() 的效果叠加。

    # 使用语法:str.strip([chars])
    # 处理两端的空格
    >>> double_str = " 句首 句尾均有空格 "
    >>> double_str.strip()     
    '句首 句尾均有空格'
    
    # 处理两端的指定字符
    >>> double_str = "你好有一个 空格你好"
    >>> double_str.strip("你好")     
    '有一个 空格'
    
  • center(width, fillchar),fillchar 为填充的字符,默认使用空格填充,返回指定宽度 width、原字符串居中、使用 fillchar 填充后的字符串。

    # 使用语法:str.center(width, fillchar)
    # 用法一:不指定填充字符,默认使用空字符填充
    >>> double_str = "我想通过两侧填充来让自己变强"
    >>> double_str.center(20)     
    '   我想通过两侧填充来让自己变强   '
    
    # 用法二:指定填充字符 【*】 
    >>> double_str.center(20,"*")  
    '***我想通过两侧填充来让自己变强***'
    
  • ljust(width, fillchar)),fillchar 为填充的字符,默认使用空格填充,返回指定宽度 width、原字符串左对齐、使用 fillchar 填充后的字符串。

    # 使用语法:str.ljust(width, fillchar)
    # 用法一:不指定填充字符,默认使用空字符
    >>> double_str = "我想通过右侧填充让自己变强"
    >>> double_str.ljust(20)     
    '我想通过右侧填充让自己变强       '
    
    # 用法二:指定填充字符 【*】 
    >>> double_str.ljust(20,"*")  
    '我想通过右侧填充让自己变强*******'
    
  • rjust(width, fillchar),fillchar 为填充的字符,默认使用空格填充,返回指定宽度 width、原字符串靠右对齐、使用 fillchar 填充后的字符串。

    # 使用语法:str.rjust(width, fillchar)
    # 用法一:不指定填充字符,默认使用空字符
    >>> double_str = "我想通过左侧填充让自己变强"
    >>> double_str.rjust(20)     
    '       我想通过左侧填充让自己变强'
    
    # 用法二:指定填充字符 【*】 
    >>> double_str.rjust(20,"*")  
    '*******我想通过左侧填充让自己变强'
    
  • zfill (width),返回长度为 width 的字符串,原字符串右对齐,前面使用 0 填充。

    # 使用语法:str.zfill (width)
    >>> double_str = "我想通过0填充让自己变强"
    >>> double_str.zfill(20)     
    '00000000我想通过0填充让自己变强'
    
  • join(seq),以指定字符串作为拼接字符,将 seq 中所有的元素(必须是字符串类型),拼接为一个新的字符串。

    # 使用语法:"[chars]".join(seq)
    # 尝试:拼接对象包含非字符串类型会报错
    >>> seq_list =["我想", "合并", "自己", 1] 
    >>> "".join(seq_list)
    Traceback (most recent call last):
      File "<input>", line 1, in <module>
    TypeError: sequence item 3: expected str instance, int found
    
    # 用法一:不指定拼接字符,默认使用空字符
    >>> seq_list =["我想", "合并", "自己"] 
    >>> "".join(seq_list)     
    '我想合并自己'
    
    # 用法二:指定拼接字符【***】
    >>> "***".join(seq_list)     
    '我想***合并***自己'
    
  • maketrans(input, out),创建字符映射的转换表,第一个字符串参数,表示需要转换的字符,第二个字符串参数表示转换的目标。

    # 使用语法:str.maketrans(input, out)
    # 注意:两个字符串的长度必须相同,否则会报如下错误。
    >>> input_str = "预备开始,1234567"
    >>> out_str = "哆来咪发唆啦西"
    >>> tran_str = str.maketrans(input_str, out_str)
    Traceback (most recent call last):
      File "<input>", line 1, in <module>
    ValueError: the first two maketrans arguments must have equal length
    
    # 正确的使用方式
    >>> input_str = "1234567"
    >>> out_str = "哆来咪发唆啦西"
    >>> tran_str = str.maketrans(input_str, out_str)
    >>> waiter_tran = "预备开始,1234567"
    >>> waiter_tran.translate(tran_str)
    '预备开始,哆来咪发唆啦西'
    

总结

  1. 通用类自建函数中, replace、join、strip、count、split、index、len、find 比较常用。

  2. 通用类自建函数支持链式调用,如处理字符串中空字符串和换行符,我们先使用 replace 处理空字符串,再使用 strip 处理换行符,可直接在后面使用.链式调用。

    >>> double_str = " 我是等待链式 调用处理的字符串 \n"
    >>> double_str.replace(" ", "").strip()
    '我是等待链式调用处理的字符串'
    
  3. index、find 效果是一样的,但是 find 有容错机制,使用时优先选择。

  4. 今天先介绍通用类自建函数的相关操作,后续将介绍其他类函数的相关操作。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,378评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,356评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,702评论 0 342
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,259评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,263评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,036评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,349评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,979评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,469评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,938评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,059评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,703评论 4 323
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,257评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,262评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,485评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,501评论 2 354
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,792评论 2 345

推荐阅读更多精彩内容