拆分字符串

在 Python 中,字符串表示为 str 对象,它们是不可变的:这意味着内存中表示的对象不能直接更改。这两个事实可以帮助您学习(然后记住)如何使用 split()。

你有没有猜到字符串的这两个特性与 Python 中的拆分函数有什么关系?如果你猜这个 split() 是一个实例方法,因为字符串是一种特殊类型,那么你是对的!在其他语言中,例如 Perl,原始字符串被用作独立字符串 split() 函数的输入,而不是在字符串本身上调用的方法。

注意:调用字符串方法的方法

像 split() 这样的字符串方法在这里主要显示为在字符串上调用的实例方法。它们也可以称为静态方法,但这并不理想,因为它更“冗长”。为了完整起见,这里是一个例子:

# 避免这种情况:

str.split('a,b,c', ',')

当您将其与您的首选用法进行比较时,这既麻烦又笨拙:

# 改为:

'a,b,c'.split(',')

有关 Python 中的实例、类和静态方法的更多信息,请参阅我们的深入教程。

字符串不变性如何?这应该提醒您,字符串方法没有到位,但它们在内存中返回了一个新对象。

注:本地操作

就地操作是直接改变调用它们的对象的操作。一个常见的例子用在一个列表的 Append() 方法上:当你调用一个列表时,直接通过在同一个列表中添加输入来改变列表 append().append()

无参数拆分

在深入之前,让我们看一个简单的例子:

>>> '这是我的字符串'.split()

['this', 'is', 'my', 'string']

这实际上是 split() 调用的一个特例,我选择它是为了简单。没有指定分隔符 split() 将任何空格计为分隔符。

裸调用 Split() 的另一个特点是它会自动删除前导和尾随空格,以及连续的空格。比较 split() 调用不带分隔符参数的以下字符串和以 '' 作为分隔符参数的调用:

>>> s u003d '这是我的字符串'

s.split()

['this', 'is', 'my', 'string']

s.split(' ')

['', 'this', '', '', 'is', '', 'my', 'string', '']

首先要注意的是,这显示了 Python 中字符串的不变性:后续调用 Split() 处理的是原始字符串,而不是第一次调用 split()。

您应该看到的第二件也是主要的事情是,裸 Split () 调用提取句子中的单词并丢弃所有空格。

指定分隔符

.另一方面,split('') 更直接。当有前导或尾随分隔符时,您会得到一个空字符串,您可以在结果列表的第一个和最后一个元素中看到该字符串。

如果有多个连续的分隔符(例如,“this”和“is”之间以及“is”和“my”之间),第一个将用作分隔符,随后的分隔符将作为空输入您的结果列表细绳。

注意:调用 split() 中的分隔符

虽然上面的例子使用单个空格字符作为分隔符输入 split(),但是作为分隔符使用的字符类型或字符串长度不受限制。唯一的要求是您的分隔符是一个字符串。你可以使用 from "..." 任何东西,甚至是 "separator"。

使用 Maxsplit 限制拆分

. split() 有另一个可选参数称为 maxplit 默认情况下 split() 将在调用时执行所有可能的拆分。但是,Maxplit 分配一个值时,只会进行给定数量的拆分。使用我们之前的示例字符串,我们可以看到 maxplit:

>>> s u003d "这是我的字符串"

s.split(maxsplitu003d1)

['this', '是我的字符串']

如上图,如果 maxplit 设置为 1,则第一个空白区域将用作分隔符,其余的将被忽略。让我们做一些练习来测试我们到目前为止所学的一切。

练习:“自己尝试一下:maxsplit”显示隐藏当您将负数作为 maxplit 参数时会发生什么?

解决方案:自己尝试:显示 maxsplit 或隐藏 split() 将在所有可用分隔符上拆分您的字符串,这也是未设置 maxplit 时的默认行为。

练习:部分理解检查显示和隐藏

您最近收到了格式错误的逗号分隔值 (CSV) 文件。你的工作是将每一行提取到一个列表中,列表的每个元素代表文件的列。是什么让它畸形?地址字段包含多个逗号,但需要表示为列表中的单个元素!

假设您的文件已作为以下多行字符串加载到内存中:

姓名、电话、地址

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() 获取其所有可选参数并获得预期输出很重要:

输入_string u003d """姓名、电话、地址

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 字符串_split_ex(未拆分):

结果 u003d []

在这里使用 splitlines() 的奖励积分,

这将更具可读性

对于 unsplit.split('\n')[1:] 中的行:

results.append(line.split(',', maxsplitu003d2))

返回结果

打印(字符串_split_ex(输入_string))

我们Split()在这里调用了两次。第一次使用可能看起来很吓人,但不要担心!我们将逐步完成它,您会对这些表达式感到满意。让我们再看一下第一个 split() 调用:unsplit split('\n')[1:]。

第一个元素是未拆分的,它只是指向输入字符串的变量。然后我们有我们的 split() 电话:split('\n')。在这里,我们拆分了一个称为换行符的特殊字符。

它有什么作用\n?顾名思义,它告诉任何读取字符串的人,它后面的每个字符都应该出现在下一行。在像我们这样的多行字符串中,输入位于每行的末尾_ 字符串有一个隐藏的 \n。

最后一部分可能是新的:[1:] 到目前为止的语句在内存中给了我们一个新的列表,[1:] 看起来像一个列表索引符号,它是——有点!这个扩展的索引符号为我们提供了一个列表切片。在这种情况下,我们在 index 处取元素 1 和所有后续元素,并在 index 处丢弃元素 0。

总之,我们遍历一个字符串列表,其中每个元素代表多行输入字符串中除第一行之外的每一行。

在每个字符串中,我们再次调用split()作为分割字符,但是这次我们只使用maxplit的前两个逗号进行分割,地址保持不变。然后我们将调用结果附加到正确命名的结果数组中,并将其返回给调用者。

连接和连接字符串

另一个基本的字符串操作与拆分字符串相反:字符串连接。如果您还没有看到这个词,请不要担心。这只是说“结合在一起”的一种奇怪方式。

与 + 运算符连接

有几种方法可以做到这一点,具体取决于您想要实现的目标。最简单和最常用的方法是使用加号 (+) 添加多个字符串。只需在要连接在一起的任意数量的字符串之间加上一个 + :

>>> 'a' + 'b' + 'c'

'ABC'

为了与数学主题保持一致,您还可以将字符串相乘并重复:

>>> '做' * 2

'渡渡鸟'

请记住,字符串是不可变的!如果连接或重复存储在变量中的字符串,则必须将新字符串分配给另一个变量以保留它。

>>> orig_string u003d '你好'

orig_string + ', world'

'你好,世界'

原始_string

'你好'

full_sentence u003d orig_string + ', world'

完整的_句子

'你好,世界'

如果我们没有不可变的字符串,full_sentence 将输出 'Hello, world, world'

另一个注意事项是 Python 不执行隐式字符串转换。如果你尝试连接一个字符串和一个非字符串类型,python 会抛出一个 TypeError:

>>> '你好' + 2

Traceback(最近一次通话最后一次):

文件“<stdin>”,第 1 行,在 <module> 中

类型错误:必须是 str,而不是 int

这是因为您只能将字符串与其他字符串连接,如果您来自尝试隐式类型转换的语言(例如 JavaScript),这对您来说可能是一种新行为。

Python join() 中从列表到字符串

还有另一种更强大的连接字符串的方法。您可以使用 join() 方法将列表从 Python 转换为字符串。

这里的一个常见用例是当您有一个由字符串(例如列表)组成的可迭代对象并且您希望将这些字符串组合成一个字符串时。像split(),。 join() 是一个字符串实例方法。如果你所有的字符串都在一个可迭代对象中,你会调用哪一个?

这是一个有点棘手的问题。请记住,当您使用 split() 时,您将调用要拆分的字符串或字符。相反的操作是 join(),因此您可以在要用于将可迭代字符串连接在一起的字符串或字符上调用它:

>>> 字符串 u003d ['do', 're', 'mi']

','.join(字符串)

'做,重新,我'

在这里,我们用逗号 (,) 连接列表的每个元素并调用 join() 而不是字符串列表。

练习:通过添加 show hide 提高可读性

如何使输出文本更具可读性?

解决方案:通过添加显示和隐藏来提高可读性

您可以做的一件事是添加间距:

>>> 字符串 u003d ['do', 're', 'mi']

', '.join(字符串)

'做,重新,我

通过在我们的连接字符串中添加一个空格,我们大大提高了输出的可读性。在添加字符串以提高可读性时,您应该始终牢记这一点。

. join() 很聪明,因为它在要添加的可迭代字符串之间插入“连接符”,而不仅仅是在每个可迭代字符串的末尾添加连接符。这意味着如果您通过 size 的第 1 次迭代,您将看不到您的参与者:

>>> 'b'.join(['a'])

'一个'

练习:部分理解检查显示和隐藏

使用我们的网络爬虫教程,您已经构建了一个很棒的天气爬虫。但是,它将字符串信息加载到列表中,每个列表都包含一个唯一的信息行以写入 CSV 文件:

[

['波士顿', 'MA', '76F', '65% Precip', '0.15 in'],

['旧金山', 'CA', '62F', '20% Precip', '0.00 in'],

['Washington', 'DC', '82F', '80% Precip', '0.19 in'],

['迈阿密', '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 中所有可用的派生。

这是我的解决方案,以列表开头并以单个字符串结尾:

输入\列表 u003d [

['波士顿', 'MA', '76F', '65% Precip', '0.15 in'],

['旧金山', 'CA', '62F', '20% Precip', '0.00 in'],

['Washington', 'DC', '82F', '80% Precip', '0.19 in'],

['迈阿密', 'FL', '79F', '50% Precip', '0.70 in']

]

我们首先将每个内部列表连接成一个字符串

加入 u003d [','.join(row) 用于输入中的行\list]

现在我们将字符串列表转换为单个字符串

输出 u003d '\n'.join(已加入)

打印(输出)

在这里,join() 不是使用一次,而是两次。首先,我们在列表推导中使用它,它将每个内部列表中的所有字符串组合成一个字符串。接下来,我们将每个字符串与我们之前看到的换行符 \ 连接起来。最后,我们简单地打印结果,以便我们可以验证它是否符合我们的期望。

把它绑在一起

虽然这结束了 Python 中最基本的字符串操作(拆分、连接和连接)的概述,但仍有许多字符串方法可以让您更轻松地操作字符串。

一旦你掌握了这些基本的字符串操作,你可能想知道更多。

Logo

学AI,认准AI Studio!GPU算力,限时免费领,邀请好友解锁更多惊喜福利 >>>

更多推荐