python中的字符串

python中的字符串类型为str,也是平时操作的类型。但除了str类型,还有一个专门的名为"string"的模块(导入即可知),是很早以前没有str类型的时候用的,现在几乎不用。

在python 3.x中,字符串的类型str是Unicode的。除此之外还有byte类型、bytearray类型。关于byte和bytearray,参考bytes和bytearray、编码和解码。

一些和字符相关的官方手册:

  1. string模块
  2. str类型详细说明
  3. 字面常量
  4. byte和bytearray
  5. byte和bytearray操作

字符串常量

下面是几个字符串:

'malong'
'malong\'s girl friend' # 包含了单引号
'malong\n' # \n换行了
"malong\n" # 换行了
'malong
girl friend' # 换行了
'malong\\n' # 没换行
'''malong's girl''' # 包含了单引号
"""malong
shuai""" # 换行了

python中可以使用单引号、双引号、三引号包围字符串,并可以使用反斜线转义特殊字符:

  • 单、双引号是完全一致的,不像其他语言一样有强、弱引用之分
  • 三引号('''xxx'''或"""xxx""")包围的字符完全是字面符号,包围什么就得到什么,包括换行,且不会进行任何转义、替换等
    • 使用这种块字符串的方式,在输入需要换行的字符串时非常方便
    • 而且可以作为块注释符注释一段代码。这表示这段被包围的代码解释为字符串,但因为没有赋值给变量,所以直接丢弃了
  • 反斜线\可以转义特殊字符,例如在字符串中保留单引号"a\'b"

但是python在输出字符串的时候,总是倾向于使用单引号,除非字符串中包含了单引号。对于那些非打印字符,将总是使用十六进制的方式输出。

例如:

>>> "aaa",'aaa'
('aaa', 'aaa') >>> print("aa\na")
aa
a
>>> print('aa\na')
aa
a >>> '''aaaa
... aaa
... '''
'aaaa\naaa\n' >>> '\001' # 二进制字符,十六进制格式输出
'\x01'

raw字符串

虽然可以通过反斜线\转义去调整字符串,但带上反斜线有时候会严重影响可读性。如果不想使用反斜线转义,可以考虑使用三引号包围,也可以使用r来声明后面的字符串是raw字符串,这里面的所有字符都是字面意义的,不会进行任何转义。

例如:

>>> 'abc\nd'
'abc\nd'
>>> len('abc\nd')
5 >>> r'abc\nd'
'abc\\nd'
>>> len(r'abc\nd')
6

经常在open()函数打开Windows文件的时候会使用raw字符串。例如下面三种方式:

open('d:\new\test.txt')   # (1)
open('d:\\new\\test.txt') # (2)
open(r'd:\new\test.txt') # (3)

(1)中解释字符串的时候,发现里面有\n和\t,它们会分别解释为换行符和制表符,这显然不可能是想要打开的文件。所以,在(2)中,使用反斜线将反斜线自身进行了转义。而(3)中使用r声明这是一个raw字符串,里面的转义序列不会进行转义,而是作为普通字符,所以这里的\表示的是路径的分隔符号。

当然,考虑到可移植性的问题,open()函数中直接使用斜线也可以表示windows中的路径分隔符。所以下面是有效的:

open('d:/new/test.txt')

注意,raw字符串不能以反斜线结尾,除非对其转义。例如r'abc\ndef\'是错误语法,但r'abc\ndef\\'是正确的语法,它表示后面有两个反斜线字符。

>>> r'abc\nd\a\\'
'abc\\nd\\a\\\\' >>> print(r'abc\nd\a\\')
abc\nd\a\\ >>> r'abc\nd\a\'
File "<stdin>", line 1
r'abc\nd\a\'
^
SyntaxError: EOL while scanning string literal

字符串转换

数值和字符串类型不能直接放在一起操作,例如9 + "9"是错误的。要将一个数值类型转换成字符串类型,可以使用str()方法或repr()方法。

>>> str(8)
'8'
>>> repr(8)
'8'

它们都表示返回字符串类型的数据。

当使用print()输出str()或repr()转换的内容,它们的结果会不一样:

>>> print(str('a'))
a
>>> print(repr('a'))
'a'

一般来说使用str()即可,在学习到__str__()和__repr__()之前,没必要去区分str()和repr()。

操作字符串

在python中,操作字符串的方式有多种,大概概括有:

  1. 字符串是一个序列,且是不可变序列,所以序列的通用操作和不可变序列的操作都能应用在str上
  2. string对象自身实现了很多方法,比如大小写转换、子串搜索、截断等等
  3. 字符串连接,如"abc" "def"或"abc" + "def"是等价的,都是"abcdef","a" * 3得到"aaa"
  4. 字符串格式化(本文不介绍,因为内容太长,见后面的文章)

例如:

>>> len("abc")
3 >>> 'abc' 'def'
'abcdef'
>>> 'abc' + 'def'
'abcdef' >>> 'abc' * 3
'abcabcabc'
>>> 3 * 'abc'
'abcabcabc'

通过字符串的乘法"*"操作,可以轻松地重复给定数量的字符。例如:

>>> print("-" * 20)
--------------------
>>> print("-" * 20)
--------------------

轻松地就能得到长度一样的分割线。

注意,这两个符号不能操作数值、字符串的混合表达式,因为python不会自动转换隐式转换数据类型。

>>> "3" + 3
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: must be str, not int

因为python中的字符串是一种序列类型,所以可以使用in来测试字符串中是否包含某个字符或子串。

>>> 'o' in "hello"
True
>>> 'a' in "hello"
False
>>> 'll' in "hello"
True

同样,因为是序列类型,可以使用for来遍历整个字符串:

>>> str = "longshuai"

>>> for i in str:
... print(i, end=",")
...
l,o,n,g,s,h,u,a,i,

在for遍历字符串的过程中,控制变量i会取得字符串中的每个字符。

字符串的索引和分片操作

字符串是一种序列,可以应用序列的一种非常方便的分片操作。关于序列的相关操作(包括分片),详细内容见python序列操作,此处介绍一些基本的操作。

必须注意,因为字符串是不可变对象,无法原处修改,所以无论是索引取值还是分片操作,都会创建新字符串对象。

索引取单个元素

例如,通过索引从字符串中取元素:

>>> str = "malong"
>>> str[0]
'm'
>>> str[1]
'a'

索引位可以是负数,表示从尾部开始取元素,-1表示倒数第一个元素,-2表示倒数第二个元素。

>>> str[-1]
'g'
>>> str[-2]
'n'

所以,-i的索引位等价于len() - i的索引位。

>>> str[-1]
'g'
>>> str[len(str) - 1]
'g'

分片取多个元素

分片的方式是使用[i:j]或[i:j:k]的方式,表示从索引位i开始取到索引位j(不包含j),i或j都可以省略。如果指定了k,则表示每隔k个元素取一次,也就是取一次元素之后跳过(k-1)一个元素。i、j、k都可以使用负数。

例如:

>>> str = 'malong'
>>> str[1:3]
'al'

[1:3]表示从索引位1取到索引位3,不包括3的元素。

可以使用负数的索引位。下面的表示从第3个元素取到倒数第2个元素,但不包含倒数第二个。

>>> str[2:-2]
'lo'

i和j都可以使用负数。

>>> str[-4:-2]
'lo'

可以省略i或j,或都省略。[:j]表示从头取到索引位为j的元素(不包含j),[i:]表示从索引位i开始取到结尾,[:]表示从头取到尾,也就是拷贝一份字符串。

>>> str[:3]
'mal'
>>> str[:-1]
'malon' >>> str[1:]
'along'
>>> str[-4:]
'long' >>> str[:]
'malong'

指定k时,可以跳过指定间隔的元素。默认为1,表示每隔一个元素取一次,也就是不跳过任何元素。指定为2时表示取1次跳过一个元素。

>>> str
'malong' >>> str[::1]
'malong' >>> str[::2]
'mln'

所以,取奇数位的字符和偶数位的字符就很简单了。

>>> str[::2]   # 取奇数位
'mln'
>>> str[1::2] # 取偶数位
'aog'

如果k为负数,则表示反序取元素。例如:

>>> 'abcde'[::-1]
'edcba'
>>> 'abcde'[::-2]
'eca'

再看下面反序输出的例子。

>>> 'abcdefgh'[5:0:-1]
'fedcb'

表示反序0-5的元素abcdef,但不包含0位,即得到fedcb。也就是说得到索引位1-5的反序结果。

所以:

>>> 'abcdefgh'[5:0:-2]
'fdb'

字符串方法

因为内容较多,本人已从官方手册翻译并整理成单独的文章,见python字符串方法整理

修改字符串

字符串是不可变数据类型,要修改字符串,只能通过分片新建字符串对象并进行合并,或者直接使用字符串方法。

例如:

>>> s = "hello"
>>> s[0] = "H"
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'str' object does not support item assignment

要修改第一个元素,可以从原始字符串中切片取出后面的字符,并结合修改的目标字符构建一个新的字符串,并赋值给原始变量。

>>> s = "hello"
>>> s = "H" + s[1:]
>>> s
'Hello'

再例如,将一个新字符串追加到源字符串的尾部:

>>> s = "hello"
>>> s = s + " world"
>>> s
'hello world' >>> s = "hello world"
>>> s = s[:6] + "your " + s[6:]
>>> s
'hello your world' >>> s = "hello world"
>>> where = s.find("world")
>>> where
6
>>> s = s[:where] + "your " + s[where:]
>>> s
'hello your world'

因为会创建新对象,所以会创建新内存空间。但这并不一定意味着效率会有多差,python对于不使用的内存空间会自动回收,在有可能的情况下python会立即重用这段空间。

python字符串类型的更多相关文章

  1. Python字符串类型判断错误

    Python里面常用的字符串类型有str和unicode,如果要判断一个对象的类型,最好用basestring,否则可能会判断错误: str1 = "hello" str2 = u ...

  2. Python字符串类型格式化之format方法

    python字符串格式化一般使用 format() 方法,用法如下: <模板字符串>.format(<逗号分割的参数>) 其中模板字符串中可以由一个或多个 {} 组成的 槽 , ...

  3. 第3章 02 python字符串类型及操作

    字符串切片 取字符串从结尾到开头,相当于字符串逆序 转义符 转义符表达特定字符的本意 转义符    \“      ---->    ” 字符串操作符 例子: 获取星期字符串 定义星期 获取用户 ...

  4. Python学习笔记(三)字符串类型及其操作(2)

    1.字符串的表示 字符串是字符的序列表示,可以由一对单引号(‘).双引号(“)或三引号(’‘’)构成.其中,单引号.双引号和三引号都可以表示单行字符串,但是只有三引号可以表示多行字符串 在使用双引号时 ...

  5. python基础之字符串类型

    一.python字符串类型概述 定义:在单引号\双引号\三引号内,由一串字符组成 name='Test' name = 'test' print(type(name)) --------------- ...

  6. Python03 字符串类型、强制类型转化、列表、元组、字典、集合

    1 字符串类型 在python中字符串类型用str表示,字符串的连接用 + 1.1 创建字符串对象 ·创建一个字符串对象有两种方式,一种方式是直接用字符串进行赋值,另外一种是利用str类实例化对象:具 ...

  7. python基础(5):数字和字符串类型

    今天总结一下数据类型中的数字和字符串型. 预习: 小练习 一.数字(int,float) 在python3中数字类型只有整形,浮点型,复数.而复数在平时的编程中几乎用不到所以我们只要掌握整形和浮点型即 ...

  8. python学习笔记(5-1)-基本数据类型-字符串类型及操作

    五.字符串处理函数  len(x):字符串x的长度.如len("12345")结果为5  str(x):任意类型x所对应的字符串形式. >>> str(123) ...

  9. python的str()字符串类型的方法详解

    字符串一旦创建,不可修改,一旦修改或者拼接,都会造成重新生成字符串,因为内存存数据是一个挨着一个存的,如果增加一个字符串的话,之前的老位置只有一个地方,不够,这是原理性的东西,在其他语言里面也一样 7 ...

随机推荐

  1. 记一次需要用到复杂的groupingBy的需求

    一:先定义结构 public class Foo { private Integer id; private String name; private BigDecimal amount; publi ...

  2. Exp5 MSF基础运用 20154320 李超

    实验后回答问题 用自己的话解释什么是exploit,payload,encode. exploit:起运输的作用,将数据传输到对方主机. payload:其实就是指装载的“具体内容”.就相当于shel ...

  3. Maven 在新版eclipse报错的解决

    转自Stack Overflow Remove all your failed downloads: Linux: find ~/.m2 -name "*.lastUpdated" ...

  4. Codeforces Round #425 (Div. 2)

    A 题意:给你n根棍子,两个人每次拿m根你,你先拿,如果该谁拿的时候棍子数<m,这人就输,对手就赢,问你第一个拿的人能赢吗 代码: #include<stdio.h>#define ...

  5. Python在Windows上安装配置测试

    Python是跨平台的,它可以运行在Windows.Mac和各种Linux/Unix系统上.在Windows上写Python程序,放到Linux上也是能够运行的. 2.x还是3.x 目前,Python ...

  6. VSCode插件开发全攻略(四)命令、菜单、快捷键

    更多文章请戳VSCode插件开发全攻略系列目录导航. 命令 我们在前面HelloWord章节中已经提到了命令写法,这里再重温一下. context.subscriptions.push(vscode. ...

  7. 16bit CRC算法C语言实现

    #define CRC_16_POLYNOMIALS 0x8005 unsigned short CRC16_3(unsigned char* pchMsg, unsigned short wData ...

  8. Android开发 - 掌握ConstraintLayout(七)辅助线(Guideline)

    了解过UI设计的同学都知道,在设计的时候,我们经常在界面上拖进一些辅助线来帮我们对齐UI元素,或者方便我们统一的页边距. 在ConstraintLayout的编辑器中,同样也支持这样的功能,我们可以创 ...

  9. HBase数据模型

    上次我们讲过了<HBase简介>,点击阅读有助于更好地理解本文.本文讲述的是HBase数据模型. 1.ROW KEY 决定一行数据按照字典顺序排序的.Row key只能存储64k的字节数据 ...

  10. Windows下编译安装 FFmpeg

    在Linux/Mac下编译 ffmpeg是非常方便的.但要在 Windows下编译 ffmpeg还真要花点时间.以下就是在 Windowns下编译ffmpeg的步骤: 一.安装Cygwin 在wind ...