Python字符串的拆分与连接详解
⽬录
拆分字符串
⽆参数拆分
指定分隔符
使⽤ Maxsplit 限制拆分
连接和连接字符串
与+运算符连接
在 Python 中从列表到字符串 .join()
⽣活中⼏乎没有什么保证:死亡、税收和需要处理字符串的程序员。字符串可以有多种形式。它们可以是⾮结构化⽂本、⽤户名、产品描述、数据库列名称,或者我们使⽤语⾔描述的任何其他内容。
由于字符串数据⼏乎⽆处不在,因此掌握有关字符串的交易⼯具⾮常重要。幸运的是,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,155********,123 Nice St, Roy, NM, USA
Anita Hernandez,155********,425 Sunny St, New York, NY, USA
Guido van Rossum,315558730,Science Park 123, 1098 XG Amsterdam, NL
您的输出应该是⼀个列表列表:
[
['Mike Smith', '155********', '123 Nice St, Roy, NM, USA'],
['Anita Hernandez', '155********', '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,155********,123 Nice St, Roy, NM, USA
Anita Hernandez,155********,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字符串的拆分与连接详解的⽂章就介绍到这了,更多相关Python字符串拆分与连接内容请搜索以前的⽂章或继续浏览下⾯的相关⽂章希望⼤家以后多多⽀持!
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论