当前位置: 首页 > 后端技术 > Python

教你Python字符串的基本操作:拆分拼接

时间:2023-03-25 23:38:13 Python

拆分字符串在Python中,字符串被表示为str对象,它们是不可变的:这意味着对象在内存中的表示不能直接改变。这两个事实可以帮助您学习(然后记住)如何使用.split()。你有没有猜到字符串的这两个属性与Python中的split函数有什么关系?如果您猜到.split()是一个实例方法,因为字符串是一种特殊类型,那么您是对的!在其他一些语言中,例如Perl,原始字符串用作独立.split()函数的输入,而不是对字符串本身调用的方法。注意:调用字符串方法的方法(如字符串方法.split())在这里主要作为对字符串调用的实例方法出现。它们也可以称为静态方法,但这并不理想,因为它更“冗长”。为了完整起见,这里有一个示例:#避免这样:str.split('a,b,c',',')当您将它与首选用法进行比较时,这是笨拙和笨拙的:#改为这样做:'a,b,c'.split(',')有关Python中的实例、类和静态方法的更多信息,请查看我们的深入教程。字符串不变性呢?这应该提醒您,字符串方法不是就地操作,而是在内存中返回一个新对象。注意:就地操作就地操作是直接更改调用它们的对象的操作。一个常见的例子是用在列表上的.append()方法:当你调用一个列表时,你通过将输入添加到同一个列表来直接改变列表。.append().append()无参数拆分在我们继续之前,让我们看一个简单的例子:>>>'thisismystring'.split()['this','is','my','string']这实际上是.split()调用的一个特例,我选择它是为了它的简单性。在不指定任何分隔符的情况下,.split()会将任何空格计为分隔符。对.split()的裸调用的另一个特性是它会自动删除前导和尾随空格,以及连续的空格。比较在以下字符串上调用时没有定界符参数的.split()和使用''作为定界符参数的调用:>>>s='thisismystring'>>>s.split()['this','is','my','string']>>>s.split('')['','this','','','is','','my','string','']首先要注意的是,这证明了Python中字符串的不变性:对.split()的后续调用处理原始字符串,而不是对.split()的第一次调用。您应该看到第二个也是最主要的事情是裸.split()调用提取句子中的单词并丢弃所有空格。另一方面,指定separator.split('')更符合字面意思。当有前导或尾随定界符时,您将得到一个空字符串,您可以在结果列表的第一个和最后一个元素中看到它。如果有多个连续的定界符(例如“this”和“is”之间以及“is”和“my”之间),第一个将用作定界符,随后的定界符将作为空字符串进入结果列表。注意:调用.split()时的分隔符尽管上面的示例使用单个空格字符作为输入.split()的分隔符,但对用作分隔符的字符类型或字符串长度没有限制。唯一的要求是您的定界符是一个字符串。您可以使用从“...”到“分隔符”的任何内容。使用Maxsplit.split()限制拆分有另一个可选参数,称为maxsplit。默认情况下,.split()将在调用时进行所有可能的拆分。但是,当您为maxsplit赋值时,只会进行给定数量的拆分。使用我们之前的示例字符串,我们可以看到maxsplit:>>>s="thisismystring">>>s.split(maxsplit=1)['this','ismystring']如上所示,如果你将maxsplit设置为1,第一个空格将用作分隔符,其余的将被忽略。让我们做一些练习来测试我们到目前为止所学的一切。练习:“自己尝试一下:Maxsplit”showhide当您将负数作为maxsplit参数时会发生什么?解决方法:“自己试一试:Maxsplit”显示隐藏。split()将在所有可用的分隔符上拆分您的字符串,这也是未设置maxsplit时的默认行为。练习:部分理解检查显示隐藏您最近收到一个格式非常糟糕的逗号分隔值(CSV)文件。您的工作是将每一行提取到一个列表中,其中的每个元素代表文件的一列。是什么让它畸形?“地址”字段包含多个逗号,但需要在列表中表示为单个元素!假设您的文件作为以下多行字符串加载到内存中:Name,Phone,AddressMikeSmith,15554218841,123NiceSt,Roy,??NM,USAAnitaHernandez,15557789941,425SunnySt,NewYork,NY,USAGuidovanRossum,315558730,SciencePark123,1098XGAmsterdam,NL您的输出应该是一个列表:[['MikeSmith','15554218841','123NiceSt,Roy,??NM,USA'],['AnitaHernandez','15557789941','425SunnySt,NewYork,NY,USA'],['GuidovanRossum','315558730','SciencePark123,1098XGAmsterdam,NL']]每个内部列表代表我们对CSV行感兴趣的内容,而外部列表将它们放在一起。解决方案:“部分理解检查”ShowHide这是我的解决方案。有几种方法可以攻击它。重要的是你.split()它的所有可选参数并获得预期的输出:input_string="""Name,Phone,AddressMikeSmith,15554218841,123NiceSt,Roy,??NM,USAAnitaHernandez,15557789941,425SunnySt,NewYork,NY,USAGuidovanRossum,315558730,SciencePark123,1098XGAmsterdam,NL"""defstring_split_ex(unsplit):results=[]#Bonuspointsforusingsplitlines()hereinstead,#这会更多unsplit.split('\n')[1:]中的行可读:调用results.append(line.split(',',maxsplit=2))returnresultsprint(string_split_ex(input_string))us.split()在这里两次。第一次来可能有点吓人,但别担心!我们将逐步完成它,您会对这些表达式感到满意。让我们再看看第一个.split()调用:unsplit.split('\n')[1:]。第一个元素是未拆分的,它只是一个指向输入字符串的变量。然后我们进行.split()调用:.split('\n')。在这里,我们在一个叫做换行符的特殊字符上进行拆分。它有什么作用\n?顾名思义,它告诉任何正在阅读该字符串的人它之后的每个字符都应该出现在下一行。在像我们这样的多行字符串中,input_string在每行的末尾都有一个隐藏的\n。最后一部分可能是新的:[1:]。到目前为止,该语句在内存中为我们提供了一个新列表,并且[1:]看起来像一个列表索引符号,有点像!这个扩展索引符号给了我们一个列表切片。在这种情况下,我们采用索引处的元素1及其之后的所有元素,丢弃索引处的元素0。总之,我们迭代了一个字符串列表,其中每个元素代表多行输入字符串的每一行,除了第一行。在每个字符串中,我们再次调用.split()using,作为分割字符,但是这次我们只使用maxsplit的前两个逗号进行分割,地址保持不变。然后,我们将该调用的结果附加到恰当命名的结果数组中,并将其返回给调用者。拼接和连接字符串另一个基本的字符串操作与拆分字符串相反:字符串拼接。如果您还没有看到这个术语,请不要担心。这只是“粘在一起”的一种奇特说法。使用+运算符连接有多种方法可以执行此操作,具体取决于您要实现的目标。最简单和最常用的方法是使用加号(+)将多个字符串相加。只需将abetween+任意数量的字符串连接在一起即可:>>>'a'+'b'+'c''abc'为了与数学主题保持一致,您还可以将Stringsaremultiplied重复:>>>'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'+2Traceback(mostrecentcalllast):File"",line1,inTypeError:必须是str,而不是int这是因为你只能将字符串与其他字符串连接起来,如果你来自像JavaScript这样试图进行隐式类型转换的语言,这对你来说可能是一种新行为。列表到字符串Python中的.join()还有另一种更强大的方法可以将字符串连接在一起。您可以使用join()方法在Python中将列表转换为字符串。这里的一个常见用例是当您有一个可迭代的字符串(如列表)时,您想要将这些字符串组合成一个字符串。与.split()一样,.join()也是一个String实例方法。如果所有字符串都在一个可迭代对象中,您会调用哪个.join()?这是一个有点棘手的问题。请记住,当您使用.split()时,您是在要拆分的字符串或字符上调用它。相反的操作是.join(),因此您可以在要用于将可迭代字符串连接在一起的字符串或字符上调用它:>>>strings=['do','re','mi']>>>','.join(strings)'do,re,mi'这里我们用逗号(,)连接字符串列表的每个元素,并在其上调用.join()而不是字符串列表。练习:“通过加入提高可读性”显示隐藏如何使输出文本更具可读性?解决方案:“通过连接提高可读性”showhide你可以做的一件事是添加间距:>>>strings=['do','re','mi']>>>','.join(strings)'do,re,mi我们通过在连接字符串中添加一个空格大大提高了输出的可读性。在连接字符串以提高可读性时,您应该始终牢记这一点。.join()很聪明,因为它在您要加入的可迭代字符串之间插入您的“连接器”,而不是仅仅在可迭代的每个字符串的末尾添加您的连接器。这意味着如果您通过大小为1的迭代,您将看不到您的加入者:>>>'b'.join(['a'])'a'练习:“部分理解检查”显示隐藏使用我们的网络抓取教程,您已经构建了一个很棒的天气抓取工具。但是,它将字符串信息加载到列表列表中,每个列表包含要写入CSV文件的唯一信息行:[['Boston','MA','76F','65%Precip','0.15in'],['旧金山','CA','62F','20%Precipe','0.00in'],['华盛顿','DC','82F','80%Precipe','0.19in'],['Miami','FL','79F','50%Precip','0.70in']]您的输出应该是这样的单个字符串:"""Boston,MA,76F,65%Precip,0.15inSanFrancisco,CA,62F,20%Precip,0.00inWashington,DC,82F,80%Precip,0.19inMiami,FL,79F,50%Precip,0.70in"""解决方案:"部分理解检查"showhide对于这个解决方案,我使用了列表理解,这是Python的一个强大功能,可以让您快速构建列表。如果您想了解更多关于它们的信息,请查看这篇涵盖Python中所有可用推导式的精彩文章。这是我的解决方案,以列表列表开始并以单个字符串结束:input_list=[['Boston','MA','76F','65%Precip','0.15in'],['SanFrancisco','CA','62F','20%Precip','0.00in'],['华盛顿','DC','82F','80%Precip','0.19in'],['迈阿密','FL','79F','50%Precip','0.70in']]#我们开始将每个内部列表连接成一个stringjoined=[','.join(row)forrowininput_list]#现在我们将字符串列表转换为单个字符串output='\n'.join(joined)print(output)这里我们使用.join()不是一次,而是两次。首先,我们在列表理解中使用它,它将每个内部列表中的所有字符串组合成一个字符串。接下来,我们将每个字符串与我们之前看到的\n换行符连接起来。最后,我们简单地打印结果,这样我们就可以验证它是否符合我们的预期。将它们结合在一起尽管对Python中最基本的字符串操作(拆分、连接和连接)的概述到此结束,但仍然有许多字符串方法可以让您更轻松地操作字符串。一旦您掌握了这些基本的字符串操作,您可能想了解更多。