教你Python字符串的基本操作:拆分和连接
摘要:由于字符串数据几乎无处不在,因此掌握有关字符串的交易工具非常重要。幸运的是,Python 使字符串操作变得非常简单,尤其是与其他语言甚至旧版本的 Python 相比时。
本文分享自华为云社区《在 Python 中拆分、连接和连接字符串》,作者: Yuchuan 。
生活中几乎没有什么保证:死亡、税收和需要处理字符串的程序员。字符串可以有多种形式。它们可以是非结构化文本、用户名、产品描述、数据库列名称,或者我们使用语言描述的任何其他内容。
由于字符串数据几乎无处不在,因此掌握有关字符串的交易工具非常重要。幸运的是,Python 使字符串操作变得非常简单,尤其是与其他语言甚至旧版本的 Python 相比时。
在本文中,您将学习一些最基本的字符串操作:拆分、连接和连接。您不仅会学习如何使用这些工具,而且会更深入地了解它们的工作原理。
拆分字符串
在 Python 中,字符串表示为str对象,它们是不可变的:这意味着不能直接更改内存中表示的对象。这两个事实可以帮助您学习(然后记住)如何使用.split().
您是否已经猜到字符串的这两个特性与 Python 中的拆分功能有何关系?如果您猜测这.split()是一个实例方法,因为字符串是一种特殊类型,那么您是对的!在其他一些语言(如 Perl)中,原始字符串用作独立.split()函数的输入,而不是对字符串本身调用的方法。
注意:调用字符串方法的方法
像这样的字符串方法.split()在这里主要显示为在字符串上调用的实例方法。它们也可以被称为静态方法,但这并不理想,因为它更“冗长”。为了完整起见,这里有一个例子:
# Avoid this: str.split('a,b,c', ',')
当您将其与首选用法进行比较时,这既笨重又笨拙:
# Do this instead: 'a,b,c'.split(',')
有关 Python 中的实例、类和静态方法的更多信息,请查看我们的深入教程。
字符串不变性怎么样?这应该提醒您字符串方法不是就地操作,但它们会在内存中返回一个新对象。
注意:就地操作
就地操作是直接更改调用它们的对象的操作。一个常见的例子是在列表上使用的.append()方法:当你调用一个列表时,通过将输入添加到同一个列表来直接更改该列表。.append().append()
无参数拆分
在深入之前,让我们看一个简单的例子:
>>> >>> 'this is my string'.split() ['this', 'is', 'my', 'string']
这实际上是.split()调用的一个特例,我选择它是为了它的简单性。没有指定任何分隔符,.split()将任何空格都算作分隔符。
裸调用的另一个特点.split()是它会自动删除前导和尾随空格,以及连续的空格。比较.split()在没有分隔符参数的情况下调用以下字符串和有' '作为分隔符参数的调用:
>>> >>> s = ' this is my string ' >>> s.split() ['this', 'is', 'my', 'string'] >>> s.split(' ') ['', 'this', '', '', 'is', '', 'my', 'string', '']
首先要注意的是,这展示了 Python 中字符串的不变性:后续调用.split()处理原始字符串,而不是第一次调用.split().
您应该看到的第二件事也是主要的事情是,bare .split()call 提取句子中的单词并丢弃任何空格。
指定分隔符
.split(' '),另一方面,更字面意思。当有前导或尾随分隔符时,您将得到一个空字符串,您可以在结果列表的第一个和最后一个元素中看到该字符串。
如果有多个连续的分隔符(例如“this”和“is”之间以及“is”和“my”之间),第一个将用作分隔符,随后的分隔符将进入您的结果列表作为空字符串。
注意:调用中的分隔符 .split()
虽然上面的示例使用单个空格字符作为 的分隔符输入.split(),但用作分隔符的字符类型或字符串长度不受限制。唯一的要求是你的分隔符是一个字符串。你可以使用从"..."到 even 的任何东西"separator"。
使用 Maxsplit 限制拆分
.split()有另一个可选参数称为maxsplit. 默认情况下,.split()将在调用时进行所有可能的拆分。maxsplit但是,当您为 赋值时,只会进行给定数量的拆分。使用我们之前的示例字符串,我们可以看到maxsplit:
>>> >>> s = "this is my string" >>> s.split(maxsplit=1) ['this', 'is my string']
如上所示,如果设置maxsplit为1,则第一个空白区域将用作分隔符,其余的将被忽略。让我们做一些练习来测试到目前为止我们学到的一切。
练习:“自己尝试:Maxsplit”显示隐藏
当你给一个负数作为maxsplit参数时会发生什么?
解决方案:“自己尝试:Maxsplit”显示隐藏
.split()将在所有可用的分隔符上拆分您的字符串,这也是maxsplit未设置时的默认行为。
练习:“部分理解检查”显示隐藏
您最近收到了一个格式非常糟糕的逗号分隔值 (CSV) 文件。您的工作是将每一行提取到一个列表中,该列表的每个元素代表该文件的列。是什么让它格式错误?“地址”字段包含多个逗号,但需要在列表中表示为单个元素!
假设您的文件已作为以下多行字符串加载到内存中:
Name,Phone,Address Mike Smith,15554218841,123 Nice St, Roy, NM, USA Anita Hernandez,15557789941,425 Sunny St, New York, NY, USA Guido van Rossum,315558730,Science Park 123, 1098 XG Amsterdam, NL
您的输出应该是一个列表列表:
[ ['Mike Smith', '15554218841', '123 Nice St, Roy, NM, USA'], ['Anita Hernandez', '15557789941', '425 Sunny St, New York, NY, USA'], ['Guido van Rossum', '315558730', 'Science Park 123, 1098 XG Amsterdam, NL'] ]
每个内部列表代表我们感兴趣的 CSV 行,而外部列表将它们保存在一起。
解决方案:“部分理解检查”显示隐藏
这是我的解决方案。有几种方法可以攻击它。重要的是您使用.split()了它的所有可选参数并获得了预期的输出:
input_string = """Name,Phone,Address Mike Smith,15554218841,123 Nice St, Roy, NM, USA Anita Hernandez,15557789941,425 Sunny St, New York, NY, USA Guido van Rossum,315558730,Science Park 123, 1098 XG Amsterdam, NL""" def string_split_ex(unsplit): results = [] # Bonus points for using splitlines() here instead, # which will be more readable for line in unsplit.split('\n')[1:]: results.append(line.split(',', maxsplit=2)) return results print(string_split_ex(input_string))
我们.split()在这里打了两次电话。第一次使用可能看起来很吓人,但别担心!我们将逐步完成它,您会对这些表达式感到满意。让我们再看看第一个.split()调用:unsplit.split('\n')[1:].
第一个元素是unsplit,它只是指向输入字符串的变量。然后我们有我们的.split()电话:.split('\n')。在这里,我们正在拆分一个称为换行符的特殊字符。
有什么作用\n?顾名思义,它告诉正在读取字符串的任何人,它后面的每个字符都应该显示在下一行。在像我们这样的多行字符串中,每行末尾input_string都有一个隐藏\n。
最后一部分可能是新的:[1:]. 到目前为止的语句给了我们一个内存中的新列表,[1:]看起来像一个列表索引符号,它是——有点!这个扩展的索引符号给了我们一个列表 slice。在这种情况下,我们取 index 处的元素1及其后的所有元素,丢弃 index 处的元素0。
总之,我们遍历一个字符串列表,其中每个元素代表多行输入字符串中除了第一行之外的每一行。
在每个字符串中,我们.split()再次调用using,作为拆分字符,但这次我们只使用maxsplit前两个逗号进行拆分,而地址保持不变。然后我们将该调用的结果附加到恰当命名的results数组并将其返回给调用者。
连接和连接字符串
另一个基本的字符串操作与拆分字符串相反:字符串连接。如果你没见过这个词,别担心。这只是说“粘合在一起”的一种奇特方式。
与+运算符连接
有几种方法可以做到这一点,具体取决于您要实现的目标。最简单和最常用的方法是使用加号 ( +) 将多个字符串相加。只需将 a 放在+您想要连接在一起的任意数量的字符串之间:
>>> >>> 'a' + 'b' + 'c' 'abc'
为了与数学主题保持一致,您还可以将字符串相乘以重复它:
>>> >>> 'do' * 2 'dodo'
请记住,字符串是不可变的!如果连接或重复存储在变量中的字符串,则必须将新字符串分配给另一个变量以保留它。
>>> >>> orig_string = 'Hello' >>> orig_string + ', world' 'Hello, world' >>> orig_string 'Hello' >>> full_sentence = orig_string + ', world' >>> full_sentence 'Hello, world'
如果我们没有不可变的字符串,full_sentence则会输出'Hello, world, world'.
另一个注意事项是 Python 不进行隐式字符串转换。如果您尝试将字符串与非字符串类型连接起来,Python将引发一个TypeError:
>>> >>> 'Hello' + 2 Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: must be str, not int
这是因为您只能将字符串与其他字符串连接起来,如果您来自像 JavaScript 这样试图进行隐式类型转换的语言,这对您来说可能是一种新行为。
在 Python 中从列表到字符串 .join()
还有另一种更强大的方法可以将字符串连接在一起。您可以使用该join()方法从 Python 中的列表转换为字符串。
这里的常见用例是当您有一个由字符串组成的可迭代对象(如列表),并且您希望将这些字符串组合成一个字符串时。就像.split(),.join()是一个字符串实例方法。如果您所有的字符串都在一个可迭代对象中,您会调用哪一个.join()?
这是一个有点棘手的问题。请记住,当您使用 时.split(),您将在要拆分的字符串或字符上调用它。相反的操作是.join(),因此您可以在要用于将可迭代字符串连接在一起的字符串或字符上调用它:
>>> >>> strings = ['do', 're', 'mi'] >>> ','.join(strings) 'do,re,mi'
在这里,我们strings用逗号 ( ,)连接列表的每个元素,并调用.join()它而不是strings列表。
练习:“通过加入提高可读性”显示隐藏
如何使输出文本更具可读性?
解决方案:“通过加入提高可读性”显示隐藏
您可以做的一件事是添加间距:
>>> >>> strings = ['do', 're', 'mi'] >>> ', '.join(strings) 'do, re, mi'
通过在我们的连接字符串中添加一个空格,我们大大提高了输出的可读性。在加入字符串以提高可读性时,您应该始终牢记这一点。
.join()很聪明,因为它将您的“joiner”插入到您想要加入的可迭代的字符串之间,而不是仅仅在可迭代的每个字符串的末尾添加您的joiner。这意味着,如果您传递 size 的迭代1,您将看不到您的加入者:
>>> >>> 'b'.join(['a']) 'a'
练习:“部分理解检查”显示隐藏
使用我们的网页抓取教程,您已经构建了一个很棒的天气抓取工具。但是,它会在列表列表中加载字符串信息,每个列表都包含要写出到 CSV 文件的唯一信息行:
[ ['Boston', 'MA', '76F', '65% Precip', '0.15 in'], ['San Francisco', 'CA', '62F', '20% Precip', '0.00 in'], ['Washington', 'DC', '82F', '80% Precip', '0.19 in'], ['Miami', 'FL', '79F', '50% Precip', '0.70 in'] ]
您的输出应该是如下所示的单个字符串:
""" Boston,MA,76F,65% Precip,0.15in San Francisco,CA,62F,20% Precip,0.00 in Washington,DC,82F,80% Precip,0.19 in Miami,FL,79F,50% Precip,0.70 in """
解决方案:“部分理解检查”显示隐藏
对于此解决方案,我使用了列表推导式,这是 Python 的一项强大功能,可让您快速构建列表。如果您想了解更多关于它们的信息,请查看这篇涵盖 Python 中所有可用推导式的精彩文章。
以下是我的解决方案,以列表列表开始并以单个字符串结尾:
input_list = [ ['Boston', 'MA', '76F', '65% Precip', '0.15 in'], ['San Francisco', 'CA', '62F', '20% Precip', '0.00 in'], ['Washington', 'DC', '82F', '80% Precip', '0.19 in'], ['Miami', 'FL', '79F', '50% Precip', '0.70 in'] ] # We start with joining each inner list into a single string joined = [','.join(row) for row in input_list] # Now we transform the list of strings into a single string output = '\n'.join(joined) print(output)
这里我们.join()不是用一次,而是用了两次。首先,我们在列表推导中使用它,它将每个内部列表中的所有字符串组合成一个字符串。接下来,我们将每个字符串与\n我们之前看到的换行符连接起来。最后,我们简单地打印结果,以便我们可以验证它是否符合我们的预期。
把这一切捆绑在一起
尽管 Python 中最基本的字符串操作(拆分、连接和连接)的概述到此结束,但仍有大量字符串方法可以让您更轻松地操作字符串。
一旦掌握了这些基本的字符串操作,您可能想了解更多。

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
初探语音识别ASR算法
摘要:语音转写文字ASR技术的基本概念与数学原理简介。 本文分享自华为云社区《新手语音入门(三): 语音识别ASR算法初探 | 编码与解码 | 声学模型与语音模型 | 贝叶斯公式 | 音素》,作者:黄辣鸡 。 语音识别技术的发展已有数十年发展历史,大体来看可以分成传统的识别的方法和基于深度学习网络的端到端的方法。 无论哪种方法,都会遵循“输入-编码-解码-输出”的过程。 图1 语音识别过程 编码过程: 语音识别的输入是声音,属于计算机无法直接处理的信号,所以需要编码过程将其转变为数字信息,并提取其中的特征进行处理。编码时一般会将声音信号按照很短的时间间隔,切成小段,成为帧。对于每一帧,可以通过某种规则(例如MFCC特征)提取信号中的特征,将其变成一个多维向量。向量中的每个维度都是这帧信号的一个特征。 图2 语音识别编码过程 解码过程: 解码过程则是将编码得到的向量变成文字的过程,需要经过两个模型的处理,一个模型是声学模型,一个模型是语言模型。声学模型通过处理编码得到的向量,将相邻的帧组合起来变成音素,如中文拼音中的声母和韵母,再组合起来变成单个单词或汉字。语言模型用来调整声学模型所得到...
- 下一篇
沈冰阳:强化学习在推荐冷启动优化中的实践探索!
分享嘉宾:沈冰阳 58集团 算法高级工程师 编辑整理:吴祺尧加州大学圣地亚哥分校 出品平台:DataFunTalk 导读:58招聘是国内最大的蓝领招聘平台,是58集团的四大核心业务之一,每天有着上千万的职位在平台上发布,同时也有百万量级的求职者在平台上进行简历投递,达成海量连接并促进大量的成功就业。招聘业务是一个典型的双边匹配任务。我们会向B端客户(招聘者)连接C端的用户(求职者)。与业界其他推荐系统相比,58职位推荐面临着更明显的冷启动问题以及蓝领用户兴趣发散的问题。本次分享想跟大家讨论我们针对以上问题使用强化学习的模型设计与应用实践。 今天的介绍会围绕下面五点展开: 58招聘业务概述 强化学习概述 推荐中的强化学习算法 强化学习在招聘冷启动的实践 总结和展望 01 58招聘业务概述 首先和大家分享下58的招聘业务场景。 首先求职者对系统给其推荐的职位进行点击,然后对感兴趣的职位进行简历投递、发起微聊、拨打电话等操作,相当于求职者单边的意向表达。然后招聘者对于求职者发起的单边连接进行回复,比如简历反馈、微聊回复、接通电话等。在进行沟通后,双方最终达成面试和入职。推荐算法工程师其实是在...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- Eclipse初始化配置,告别卡顿、闪退、编译时间过长
- 设置Eclipse缩进为4个空格,增强代码规范
- Hadoop3单机部署,实现最简伪集群
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题
- 2048小游戏-低调大师作品
- CentOS6,CentOS7官方镜像安装Oracle11G
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- SpringBoot2更换Tomcat为Jetty,小型站点的福音