Python 的字符串和相关函数

作者: , 共 3216 字 , 共阅读 0

1、一些细节介绍

1.1、字符串编码

在 Python3 以上,通常说的字符串是指unicode字符串,以下将不再重复强调。

1.2、转义和 r 前缀禁止转义

字符串里的\表示转义,比如下面的s1,表示一个换行符,实际只有一个字符:

s1 = "\n"
assert(len(s1) == 1)

我们可以用r前缀来取消\的转义,比如下面的s2,它就是真正的"\n",有两个字符:

s2 = r"\n"
assert len(s2) == 2
assert s2 == "\\n"

1.3、Python 三引号

三引号的语法是一对连续的单引号或者双引号(通常都是成对的用)。Python 中三引号可以将复杂的字符串进行赋值。

Python 三引号允许一个字符串跨多行,字符串中可以包含换行符、制表符以及其他特殊字符。

s3 = """我换行了。
我是下一行"""

s4 = '''三个单引号也可以。'''

1.4、格式化

Python 的字符串支持三种格式化方法。第一种是普通的%,语法类似于C++printf,使用%锡类转义符,和C++通用:

s5 = "%s is %d years old" % ("junbao", 6)

第二种是format函数,类似于C++std::format(或者fmt::format):

s6 = "{} is {age:d} years old".format("junbao", age=6)

第三种是一种语法糖,结合了format和变量,写法更简洁:

name = "junbao"
age = 6
s7 = f"{name} is {age:d} years old"

2、大小写相关

  • string.capitalize() 第一个字符大写。
  • string.swapcase() 翻转大小写。
  • string.upper() 都转为大写。
  • string.lower() 都转为小写。
  • string.title() 返回"标题化"的 string,就是说所有单词都是以大写开始,其余字母均为小写。

3、查找和替换

  • string.startswith(obj,beg=0):检查字符串是否以指定字符串开头,
  • string.endswith(obj,end=len(string)):检查字符串是否以指定字符串结尾。
  • string.count(str,beg,end):返回出现次数。
  • string.find(str,beg,end):查找位置,没找到返回-1。
  • string.index(str,beg,end):查找位置,没找到会抛出异常。
  • string.find(str,beg,end):从结尾查找位置,没找到返回-1。
  • string.index(str,beg,end):从结尾查找位置,没找到会抛出异常。
  • string.replace(str1, str2, num):替换指定字符串,次数不超过num次。

4、分割和连接

  • string.split(sep,num):按照制定字符分割,默认按照空字符(包括空格、换行、制表符等)分割。最多返回 num+1 个字符串。
  • string.splitlines(keepends=False):按行分割。keepends 表示是否保留结尾的换行符。
  • string.partition(str):根据 str 分割,返回三元组(str_left, str, str_right)
  • iter.jion(str):用 str 将各个值连接起来。split的反向操作。

5、字符串填充和去除

  • string.rjust(width, fillchar=' '): 左边填充,直到长度等于width
  • string.center(width, fillchar=' '): 两边填充,直到长度等于width
  • string.zfill(width):等价于string.rjust(width, '0')
  • string.ljust(width, fillchar=' '): 右边填充,直到长度等于width
  • string.lstrip(chars=' \n'):去掉左边的指定字符。
  • string.lstrip(chars=' \n'):去掉右边的指定字符。
  • string.strip(chars=' \n'):去掉两边的指定字符。

6、字符类型

以下函数如果string为空,总是返回False

  • string.isspace():是否为空字符,包括空格、换行符、制表符。
  • string.isalpha():是否都是字母。
  • string.isdecimal():是否都是 0 到 9 的 ASCII 数字,是通常认识的数字概念。
  • string.isdigit():是否为数字,包括单字节和全角数字,但不包括汉字数字、罗马数字!
  • string.isnumeric():是否都是数字,包括汉字数字、全角数字、罗马数字。
  • string.isalnum():是否都是字母或数字(包括汉字数字等)。
  • string.isupper():是否都是大写。
  • string.istitle():每个单词都是否为首字母大写。

简单遍历字符,可看出 decimal, digit 和 numeric 的区别:

import itertools

decimals = ""
digits = ""
numerics = ""
for number in itertools.chain(range(1000), range(4969, 4978), range(8304, 11000)):
    char = chr(number)
    if char.isdecimal():
        decimals += char
    if char.isdigit():
        digits += char
    if char.isnumeric():
        numerics += char

print("decimals =", decimals)
print("digits =", digits)
print("numerics =", numerics)

输出结果为:

decimals = 0123456789
digits = 0123456789²³¹፩፪፫፬፭፮፯፰፱⁰⁴⁵⁶⁷⁸⁹₀₁₂₃₄₅₆₇₈₉①②③④⑤⑥⑦⑧⑨⑴⑵⑶⑷⑸⑹⑺⑻⑼⒈⒉⒊⒋⒌⒍⒎⒏⒐⓪⓵⓶⓷⓸⓹⓺⓻⓼⓽⓿❶❷❸❹❺❻❼❽❾➀➁➂➃➄➅➆➇➈➊➋➌➍➎➏➐➑➒
numerics = 0123456789²³¹¼½¾፩፪፫፬፭፮፯፰፱⁰⁴⁵⁶⁷⁸⁹₀₁₂₃₄₅₆₇₈₉⅐⅑⅒⅓⅔⅕⅖⅗⅘⅙⅚⅛⅜⅝⅞⅟ⅠⅡⅢⅣⅤⅥⅦⅧⅨⅩⅪⅫⅬⅭⅮⅯⅰⅱⅲⅳⅴⅵⅶⅷⅸⅹⅺⅻⅼⅽⅾⅿↀↁↂↅↆↇↈ↉①②③④⑤⑥⑦⑧⑨⑩⑪⑫⑬⑭⑮⑯⑰⑱⑲⑳⑴⑵⑶⑷⑸⑹⑺⑻⑼⑽⑾⑿⒀⒁⒂⒃⒄⒅⒆⒇⒈⒉⒊⒋⒌⒍⒎⒏⒐⒑⒒⒓⒔⒕⒖⒗⒘⒙⒚⒛⓪⓫⓬⓭⓮⓯⓰⓱⓲⓳⓴⓵⓶⓷⓸⓹⓺⓻⓼⓽⓾⓿❶❷❸❹❺❻❼❽❾❿➀➁➂➃➄➅➆➇➈➉➊➋➌➍➎➏➐➑➒➓ 

7、编码相关

  • string.encode():转为二进制字符串。
  • bytes.decode():二进制字符串转为字符串。

Q. E. D.

类似文章:
编程 » SQL
现在 Access 用的人应该不多了,本来我以为我也不可能用这玩意儿,但最近在用 VBA 通过 SQL 处理数据时,发现它的语法是 Access 的语法。平时对 SQL Server 语法相对熟悉一些。下文总结了 Access 和 SQL Server 语法的差异。
IT »
有时候用vim打开文件,每行结尾都有一个灰色的^M。这个原因是该文件在 windows 系统上被创建。windows 的换行符是\n\r,而 unix 下的文本换行只需要\n,这个多余的\r就被显示为^M,虽然显示为两个字符,但其实是一个字符。
在 Python 中操作文件或字符串时,有时候会碰到 UnicodeDecodeError 异常:
IT » gnu, Linux
简单列一些 Linux 自带的 GNU 命令的常用用法,可以当做 cheatsheet 使用。
Python 数据分析工具 pandas 中以 DataFrame 和 Series 作为主要的数据结构。
IT » 排版, Markdown
很久以前,我就意识到中英文混排时,英文和中文之间加一个空格之后,排版会好看很多。为此,我还专门去找了处理 Markdown 文件的插件
编程 » C++, popen
popen函数可以获取比std::system函数更详细的程序输出。只是正常调用 popen 只能获取 stdout 的输出,而 stderr 的输出被忽略。
编程 » Excel, lotus, VBA
公司使用 Lotus ,我每天都通过 Excel 编写 VBA 代码自动调用 Lotus 发送邮件,发现一个奇怪的现象。一般我们通过下面的 VBA 代码指定邮件收件人:
Python 提供很多语法糖,用起来非常方便。@dataclass 就是其中之一。
编程 » C++, folly
高效程序总是尽量避免频繁触碰在堆上分配和释放内存,所以无论是std::string还是folly:fbstring都做了SSO( small string optimization )。而folly::FixedString是一个很有意思的实现,它可以把任意长度的字符串都放在堆上。代码可见https://github.com/facebook/folly/blob/master/folly/FixedString.h
几周前爬箭扣,用 GT2 手表,在登山模式下记录的爬升高度严重异常,爬升高度高达 978 米。但手机上用专用户外 APP (两步路)记录的爬升只有 610 米。
碎碎念 » 日本
下面记录一些了解到的日本福岛核污染的一些数据和情况。