程序员文章、书籍推荐和程序员创业信息与资源分享平台

网站首页 > 技术文章 正文

python散装笔记——41: 字符串的方法(3)

hfteth 2025-01-16 19:39:12 技术文章 9 ℃

10: 字符串包含

Python 使检查字符串是否包含给定子串变得非常直观。只需使用 in 操作符:

>>> "foo" in "foo.baz.bar"
True

注意:测试空字符串的结果总是 True:

>>> "" in "test"
True

11: 将字符串列表连接成一个字符串

字符串可用作分隔符,使用 join() 方法将字符串列表连接成一个字符串。例如,您可以创建一个字符串,其中列表中的每个元素都用空格分隔。

>>> " ".join(["once","upon","a","time"])
"once upon a time"

下面的示例用三个连字符分隔字符串元素。

>>> "---".join(["once", "upon", "a", "time"])
"once---upon---a---time"

12: 计算子串在字符串中出现的次数

有一种方法可用于计算子字符串在另一个字符串中出现的次数,即 str.count

str.count(sub[, start[, end]])

str.count 返回一个 int 表示子字符串 sub 在另一个字符串中非重叠出现的次数。可选参数 startend 表示搜索的起点和终点。默认情况下,start = 0end = len(str) 表示搜索整个字符串:

>>> s = "She sells seashells by the seashore."
>>> s.count("sh")
2
>>> s.count("se")
3
>>> s.count("sea")
2
>>> s.count("seashells")
1

通过为 startend 指定不同的值,我们可以得到更本地化的搜索和计数,例如,如果start等于13,则调用:

>>> s.count("sea", start)
1

等价于

>>> t = s[start:]
>>> t.count("sea")
1

13: 不区分大小写的字符串比较

以大小写不敏感的方式比较字符串似乎是一件微不足道的事情,但事实并非如此。本节只考虑 unicode 字符串(Python 3 中的默认值)。请注意,Python 2 相对于 Python 3 可能有一些微妙的弱点--后者的 unicode 处理要完善得多。

首先要注意的是,unicode 中的大小写转换并不简单。有些文本的 text.lower() != text.upper().lower(),例如 `“ß”:

>>> "ß".lower()
'ß'
>>> "ß".upper().lower()
'ss'

但是,假设您想对 “BUSSE”“Buße”进行无例比较。您可能还想比较“BUSSE”“BUE”是否相等--这是较新的大写形式。建议使用大小写:

Python 3.x Version ≥ 3.3

help(str.casefold)
"""
Help on method_descriptor:
casefold(...)
S.casefold() -> str
Return a version of S suitable for caseless comparisons.
"""

不要只使用 lower。如果没有casefold,使用.upper().lower()会有帮助(但只是有一点)。

然后,您应该考虑重音符号。如果你的字体渲染器很好,你可能会认为 “ê” == “ê” - 但事实并非如此:

>>> "ê" == "ê"
False

这是因为它们实际上

>>> import unicodedata

>>> [unicodedata.name(char) for char in "ê"]
['LATIN SMALL LETTER E WITH CIRCUMFLEX']

>>> [unicodedata.name(char) for char in "ê"]
['LATIN SMALL LETTER E', 'COMBINING CIRCUMFLEX ACCENT']

最简单的处理方法是unicodedata.normalize。您可能希望使用 NFKD 归一化,但请随时查阅文档。然后

>>> unicodedata.normalize("NFKD", "ê") == unicodedata.normalize("NFKD", "ê")
True

最后,这里用函数来表示:

import unicodedata

def normalize_caseless(text):
  return unicodedata.normalize("NFKD", text.casefold())

def caseless_equal(left, right):
  return normalize_caseless(left) == normalize_caseless(right)

14:字符串正当化

Python 提供了对字符串进行正当化的函数,使文本填充更容易使各种字符串对齐。

下面是 str.ljuststr.rjust 的示例:

interstates_lengths = {
  5: (1381, 2222),
  19: (63, 102),
  40: (2555, 4112),
  93: (189,305),
}
for road, length in interstates_lengths.items():
  miles,kms = length
  print('{} -> {} mi. ({} km.)'.format(str(road).rjust(4), str(miles).ljust(4), str(kms).ljust(4)))

40 -> 2555 mi. (4112 km.)
19 -> 63 mi. (102 km.)
5 -> 1381 mi. (2222 km.)
93 -> 189 mi. (305 km.)

ljustrjust 非常相似。两者都有一个 width 参数和一个可选的 fillchar 参数。这些函数创建的字符串长度至少与传入函数的 width 参数相同。如果字符串的长度已超过宽度,则不会被截断。fillchar 参数(默认为空格字符 ' ')必须是单字符,而不是多字符串。

ljust 函数用 fillchar 填充被调用字符串的末尾,直到字符串长度达到 width 为止。rjust 函数以类似方式填充字符串的开头。因此,这些函数名称中的 lr 指的是原始字符串(而非填充字符串)在输出字符串中的位置。

15: 测试字符串的起始字符和终止字符

为了在 Python 中测试给定字符串的开始和结束,可以使用方法 str.startswith()str.endswith()

str.startswith(prefix[, start[, end]])

顾名思义,str.startswith 用于测试给定字符串是否以prefix中的给定字符开始。

>>> s = "This is a test string"
>>> s.startswith("T")
True
>>> s.startswith("Thi")
True
>>> s.startswith("thi")
False

可选参数 start 和 end 指定了测试开始和结束的起点和终点。在下面的示例中,如果指定起点值为 2,我们将从位置 2 开始搜索字符串,然后再搜索其他位置:

>>> s.startswith("is", 2)
True

由于 s[2] == 'i's[3] == 's',因此结果为true

您还可以使用元组检查它是否以一组字符串中的任何一个开头

>>> s.startswith(('This', 'That'))
True
>>> s.startswith(('ab', 'bc'))
False

str.endswith(prefix[, start[, end]])

str.endswithstr.startswith 完全类似,唯一的区别是它搜索的是结束字符,而不是开始字符。例如,要测试一个字符串是否以句号结束,可以这样写

>>> s = "this ends in a full stop."
>>> s.endswith('.')
True
>>> s.endswith('!')
False

startswith 一样,可以使用多个字符作为结束序列:

>>> s.endswith('stop.')
True
>>> s.endswith('Stop.')
False

您还可以使用 “元组 ”来检查它是否以一组字符串中的任意一个结束

>>> s.endswith(('.', 'something'))
True
>>> s.endswith(('ab', 'bc'))
False

16: 字符串或字节数据与 unicode 字符之间的转换

文件和网络信息的内容可能代表编码字符。它们通常需要转换为 Unicode 才能正确显示。

在 Python 3 中,您可能需要将字节数组(称为 “字节字面量”)转换为 Unicode 字符串。现在的默认值是 Unicode 字符串,字节字面量必须输入 b''b"" 等。字节字面量将返回 Trueisinstance(some_val, byte),假定 some_val 是可能被编码为字节的字符串。

Python 3.x Version ≥ 3.0

# 您从文件或网络中获取以 UTF-8 编码的“© abc”。

s = b'\xc2\xa9 abc' # s 是字节数组,而不是字符
                    # 在 Python 3 中,字符串字面量默认为 Unicode;字节数组字面量需要一个前导 b
s[0] # b'\xc2' - 无意义字节(无编码等上下文)
type(s) # bytes - 现在,字节数组是显式的,Python 可以显示这一点。

u = s.decode('utf-8') # Unicode 终端上的"© abc"
                      # bytes.decode 将字节数组转换为字符串(在 Python 3 中,字符串将是 Unicode 编码)。
u[0] # '\u00a9' - 统一码字符 “版权符号”(U+00A9)"©"
type(u) # str
        # Python 3 的默认字符串字面量是 UTF-8 Unicode

u.encode('utf-8') # b'\xc2\xa9 abc'
                  # str.encode 会生成一个字节数组,以未转码字符的形式显示 ASCII 范围内的字节。

Tags:

最近发表
标签列表