了解如何在 Python 中获取字符串的子字符串。

学习任何新事物都可能是一个挑战。使用 Python 越多,你就越会注意到字符串出现的频率。Python 中的字符串操作是一项重要技能。在本文中,我们向您介绍如何在 Python 中生成字符串的子字符串。

Python 是一门值得学习的好语言,尤其是对于初学者来说,正如我们在 本文 。我们甚至开设了一门关于 使用 Python 字符串的 。它包含交互式练习,旨在从基础级别开始,并教您有关这种重要数据类型的所有知识。一旦您熟悉了使用字符串,就可以研究一些有趣的数据科学问题。查看 Python 数据科学 课程,该课程将为您介绍这个多样化的主题。

切片和拆分字符串

在 Python 中获取字符串子字符串的第一种方法是切片和拆分。让我们先定义一个字符串,然后看几个例子:

>>> string = 'This is a sentence. Here is 1 number.'

您可以将此字符串拆分为子字符串,每个子字符串都具有 str 数据类型。即使您的字符串是数字,它仍然是这种数据类型。您可以使用内置 type() 函数对此进行测试。数字也可能是其他类型,包括 decimal 在此处 讨论的数据类型 .

与 Python 中的数组和列表非常相似,可以通过指定起始和终止索引(在方括号内并用冒号分隔)来对字符串进行切片。这将返回原始字符串的子字符串。

请记住,Python 中的索引从 0 开始。要从字符串中获取前 7 个字符,只需执行以下操作:

>>> print(string[:7])
	This is

注意这里我们没有明确指定起始索引。因此,它采用默认值 0。

顺便说一句,如果你想要有关该 print() 功能的更多信息,请查看 这篇文章 。它可能比你想象的还要多。

我们还可以通过指定负的起始值来相对于字符串的末尾进行索引:

>>> print(string[-7:])
	number.

由于我们没有指定结束值,因此它采用默认值 len(string) 。如果您知道特定单词的开始和结束索引,则可以像这样从字符串中提取它:

>>> print(string[10:18])
sentence

然而,这对于从字符串中提取单个单词来说并不是最佳的,因为它需要提前知道索引。

获取字符串子字符串的另一种方法是将其拆分为单词,这可以使用该 string.split() 方法完成。这需要两个可选参数:一个字符串,定义在哪些字符处拆分(默认为任何空格),以及最大拆分次数(默认为 -1,表示无限制)。例如,如果我们想在空格处拆分,您可以执行以下操作,这将返回一个字符串列表:

>>> string.split(' ')
['This', 'is', 'a', 'sentence.', 'Here', 'is', '1', 'number.']

但请注意,“句子”和“数字”这两个词的末尾有句号(点字符)。在本文后面讨论正则表达式时,我们会再次讨论这个问题。

Python 中有很多内置的字符串方法。它们允许您修改字符串、测试其属性或在其中进行搜索。在 Python 中生成更复杂的字符串子字符串的一种有用方法是方法 string.join() 。它接受字符串的可迭代对象并将它们连接起来。以下是一个例子:

>>> print(' and '.join(['one', 'two', 'three']))
one and two and three

利用巧妙的索引技巧,这可用于打印包含原始字符串中每个第二个单词的子字符串:

>>> print(' '.join(string.split(' ')[::2]))
This a Here 1

由于该方法的输入 join() 是列表,因此您可以进行列表推导,例如,从所有长度等于 4 的单词中创建一个子字符串。如果您正在寻找更具挑战性的练习,请亲自尝试一下。我们还将在本文后面向您展示另一种方法。如果您想知道如何在 Python 中将字符串写入文件,请查看 这篇文章 .

parse 模块

有一个鲜为人知的 Python 模块叫做 parse ,它具有在 Python 中生成子字符串的强大功能。此模块不是 Python 的标准配置,需要单独安装。最好的方法是 pip install 从终端运行该命令。

下面展示了如何使用解析函数获取子字符串,该函数接受两个参数:

>>> import parse
>>> substring = parse.parse('This is {}. Here is 1 {}.', 'This is a sentence. Here is 1 number.')
>>> substring.fixed
('a sentence', 'number')

调用 fixed 方法 on substring 将返回一个元组,其中包含从第二个参数中提取的子字符串,位于第一个参数中花括号的位置 {} 。对于熟悉字符串格式化的人来说,这可能看起来非常熟悉。事实上,parse 模块与相反 format() 。看看这个,它的作用与上面的代码片段相反:

>>> print('This is {}. Here is 1 {}.'.format('a sentence', 'number'))
This is a sentence. Here is 1 number.

在我们讨论解析模块时,值得讨论一下搜索功能,因为搜索是处理字符串时的常见用例。搜索的第一个参数通过使用花括号指定搜索词来定义您要查找的内容。第二个参数定义查找的位置。

以下是一个例子:

>>> result = parse.search('is a {}.', 'This is a sentence. Here is 1 number')
>>> result.fixed
('sentence',)

再次,调用该 fixed 方法将返回包含结果的元组。如果您想要结果的开始和结束索引,请调用 spans 方法。使用 parse 模块在字符串中搜索很不错 - 它对于您定义要搜索的内容(即第一个参数)的方式非常可靠。

常用表达

我们要讨论的最后一个 Python 模块是 re,它是“regex”的缩写,而“regex”本身又是“正则表达式”的缩写。正则表达式可能有点令人生畏 - 它们涉及定义高度专业化且有时复杂的模式来在字符串中进行搜索。

您可以使用正则表达式在 Python 中提取子字符串。这个主题太深奥,无法在这里全面介绍,所以我们只提到一些有用的函数,让您了解如何定义搜索模式。有关此模块及其功能的更多信息,请参阅 文档 .

findall() 函数接受两个必需参数: pattern string 。让我们首先从上面使用的字符串中提取所有单词:

>>> re.findall(r'[a-z]+', 'This is a sentence. Here is 1 number.', flags=re.IGNORECASE)
['This', 'is', 'a', 'sentence', 'Here', 'is', 'number']

[a-z] 模式匹配所有小写字母, + 表示单词可以是任意长度,标志告诉您忽略大小写。将此结果与我们上面使用得到的结果进行比较 string.split() ,您会注意到不包括句号。

现在,让我们从字符串中提取所有数字:

>>> re.findall(r'\b\d+\b', 'This is a sentence. Here is 1 number.')
['1']

\b 匹配模式开头和结尾的边界, \d 匹配 0 到 9 之间的任意数字,并且再次 + 表示数字可以是任意长度。例如,我们用以下内容查找所有长度为 4 个字符的单词:

>>> re.findall(r'\b\w{4}\b', 'This is a sentence. Here is 1 number.')
['This', 'Here']

\w 匹配任何单词,而 {4} 定义要匹配的单词的长度。要生成子字符串,您只需使用 string.join() 我们上面所做的操作即可。这是我们之前提到的列表推导的替代方法,它也可以用于生成所有单词长度为 4 的子字符串。

这个模块中还有其他函数值得一看。 match() 可用于确定模式是否在字符串的开头匹配,并 search() 扫描字符串以查找模式出现的任何位置。

关于在 Python 中生成子字符串的总结

在本文中,我们讨论了在 Python 中提取和打印字符串的子字符串。以此为基础探索其他主题,例如从网站抓取数据。您可以定义一个正则表达式模式来从字符串中 提取电子邮件地址 吗?或者从此段落中删除标点符号?如果可以,您就快要成为数据管理员了!

如果你也经常处理表格数据,我们有一篇文章向你展示了如何 在 Python 中漂亮地打印表格 。慢慢地把这些技能加到你的工具箱里,你就会成为一名专业的程序员。

点赞(0) 打赏

评论列表 共有 0 条评论

暂无评论

微信小程序

微信扫一扫体验

立即
投稿

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部