我们总结了 Python 中的基本字符串操作。对于有经验的人来说可能还不够,但是...
(补充2018.12.23:print语法现已兼容Python3,如果Python2中复制粘贴的代码不起作用from __future__ import print_function,请放在代码端开头。)
Python 字符串 = 不可变
Python 字符串是不可变的,所以即使你想部分重写它们,你
也必须将它们组装成一个新的字符串对象。
例如,执行字符串替换的方法replace返回另一个字符串对象,其中包含替换的内容。
链接
使用运算符进行连接+。
a = 'Python' b = '2.7' c = a + b print(c) # => 'Py;
由于是按顺序处理的,即使连接很多也没关系
a = 'Python' b = ' is ' c = 'fancy' print(a + b + c) # => 'Python is fancy'
join还有一种使用方法和列表/元组连接的技术。
顺便说一句,ruby 的joinArray 方法(将连接的字符串作为参数),Python 的joinstr 方法(将列表/元组作为参数),反之亦然,所以如果你对 Ruby 有丰富的经验,你应该小心。
strings = ['dog', 'cat', 'penguin'] print(','.join(strings)) #=> 'dog,cat,penguin'
重复
如果重复相同的内容,如果*运算符给出一个整数,则会生成一个重复指定次数的字符串。
s = 'dog?' print(s * 3) #=> 'dog?dog?dog?'
嵌入价值
有三种方法可以将变量的值扩展为字符串。也许还有其他我不知道的。
- sprintf 风格: '%s, %s' % ('Hello', 'World')
- 扩展 sprintf 风格: '%(a)s, %(b)s' % dict(a='Hello', b='World')
- 使用格式方法: '{0}, {1}'.format('Hello', 'World')
(注)我不知道第二个的确切名称,但我决定将其称为扩展的 sprintf 样式。
sprintf 风格
如果你给一个带有操作符的字符串一个值或列表/元组%,它可以展开如下。
a = 'Python' b = 'a programming language' print('%s is %s' % (a, b)) # => 'Python is a programming language' c = 'World' print('Hello, %s!' % c) # => 'Hello, World!'
您还需要提供与字符串中的扩展符号(等等)一样多的值%s。它不能多或少。如果有一个扩展符号,%后面的值不需要是列表/元组。(也是由一个元素列表/元组展开)在上面的例子中,第一个print语句的模板字符串%s包含两个展开符号,所以%后面的值给出的元组元素个数也变成了两个。%如果要将字符本身保留为模板字符串中的字符,请%%使用'%' 2 characters。
有以下格式说明符。除非您确定,否则暂时离开%s它可能是个好主意。我想解释如何将格式说明符写入printf 的维基百科页面。
- %s --展开为字符串
- %d -- 展开为整数
- %f -- 扩展为小数点
如果您想将元组和列表扩展为'(1, 2, 3)'字符串,例如
tuple_var = (1, 2, 3) print('tuple_var is: %s' % (tuple_var,))
如果你不这样做,你会生气,就像只有一个可以替换的占位符一样,即使有三个,所以要小心。
扩展的 sprintf 风格
* 扩展 sprintf 风格是我给自己起的名字 (^^;
在格式字符串后面的括号中指定dict对象的key,在格式字符串%的运算符右侧指定dict对象%。如果在重复嵌入相同的值时已经有一个 dict 变量,这很有用。
v = dict(first='Michael', family='Jackson') print('He is %(first)s, %(first)s %(family)s.' % v)
格式方法的使用
format您可以通过使用format方法来使用特定于方法的模板语言。
print('{0}, {1}'.format('Hello', 'World')) #=> 'Hello, World'
有关更多详细信息,请参阅格式化迷你语言规范。
代替
s = 'Today is Monday.' ss = s.replace('Monday', 'Sunday') #=> 'Today is Sunday.' print(ss) s2 = 'Hello Hello' ss2 = ('Hello', 'Bye') #=> 'Bye Bye' 第三引数を指定しなければすべて置換される print(ss2) s3 = 'World World' ss3 = ('World', 'Hello', 1) #=> 'Hello World' # 第三匹数で置換する個数を指定 print(ss3)
对于按照某种模式替换字符串等处理,使用re(正则表达式)包的sub方法。
import re s = 'Hello World' prin(r"[a-z]", "A", s)) #=> 'HAAAA WAAAA'
获取第 N 个字符
s = 'abc' n = 1 # 'a'がほしい print(s[n-1]) # 0ベースインデックスで文字を取得 s2 = 'xyz' print(s[-1]) # 'z' 最後の文字
获取一个子串(从第N个字符中取出M个字符)
s = "This is a pen." n = 1 m = 4 print(s[n-1:n-1+m]) # 'This' print(s[0:4]) # 'This' print(s[-4:-1]) # 'pen'
搜索
find用来。当您想向后搜索时可以使用它rfind。
find 如果找到相应的字符串,则返回从 0 开始的字符串位置,如果没有找到,则返回 -1。
s = 'abcabcabc' index = s.find('b') # indexは1(2文字目)
您可以使用第二个参数指定开始搜索的位置。
s = 'abcabcabc' index = s.find('b', 2) # indexは4(5文字目)
您可以使用以下代码在字符串中找到所有目标。
s = 'abcabcabc' target = 'b' index = -1 while True: index = s.find(target, index + 1) if index == -1: break print('start=%d' % index)
一次处理一个字符
由于字符串类型也是一个迭代器,所以可以用for进行如下处理。我希望你想要一个字符列表list(strvalue)。
for c in 'aiueo': print(c) print(list('hoge')) # => ['h', 'o', 'g', 'e']
可能有一种方法可以在引用索引中的字符时进行提取。
s = 'aiueo' for i in range(len(s)): c = s[i] print(c)
去掉两端的空白
strip,,可以使用lstrip。 strip 是一个字符串,从两端删除了空格、制表符和换行符(\r 和 \n), lstrip 仅对左端应用与 strip 相同的处理,而 rstrip 仅对 strip 应用相同的处理右端。返回应用的内容。rstrip
s = ' x ' print('A' + s.strip() + 'B') # => 'AxB' print('A' + s.lstrip() + 'B') # => 'Ax B' print('A' + s.rstrip() + 'B') # => 'A xB'
删除换行符(相当于perl或ruby chomp的处理)
rstrip看起来可以做到。但是,如果有两个结尾有空格和换行符的模式,并且您只想删除换行符,则需要使用参数指定要删除的字符。
line = 'hoge\n' msg = line.rstrip() + 'moge' print(msg) # => 'hogemoge' with open('.;) as fh: for line in fh: no_line_break_line = line.rstrip() # なにかする # 空白は削除せずに改行だけ削除する line_with_space = 'line \n' # 改行の前の空白は削除したくない prin('\n')) # => 'line '
全部大写
upper()使用方法。
print('hello'.upper()) # => 'HELLO'
全部小写
lower()使用方法。
print('BIG'.lower()) # => 'big'
找出字符串是否作为子字符串包含在内
s = 'abc' print('b' in s) #=> True print('x' in s) #=> False
计算字符串作为子字符串出现的次数
find您可以使用之前提出的方法自己做,count但是有一个方便的方法。
s = 'aaabbc' prin('b')) #=> 2
将 int 转换为字符串
v = 1 print(str(v)) print('%d' % v)
将浮点数转换为字符串
f = 1.234 print(str(f)) #=> '1.234' print('%f' % f) #=> '1.234000'
将列表转换为字符串,将元组转换为字符串
有时您想在调试打印等中将其表示为字符串。
v = [1,2,3] print(str(v)) #=> '[1, 2, 3]' print('%s' % v) #=> '[1, 2, 3]'
%s如果您尝试显示一个元组,Python 会将给定的元组解释为模板的值列表,您将收到错误消息。
v = (1, 2, 3) print(str(v)) #=> '(1, 2, 3)' よい例 print('%s' % v) #=> '(1, 2, 3)'を期待するが、TypeErrorになってしまう print('%s' % (v,)) #=> '(1, 2, 3)' よい例
join尝试使用诸如组装也很好。
v = [1,2,3] print('<' + ('/'.join([ str(item) for item in v ])) + '>') #=> '<1/2/3>'
tuple对象也是如此。
将字典转换为字符串
有时您想在调试打印等中将其表示为字符串。
v = dict(a=1, b=2) print(str(v)) #=> "{'a': 1, 'b': 2}" print('%s' % v) #=> "{'a': 1, 'b': 2}"
keys您还可以使用或列表理解join生成一个带有一个衬里的字符串。
v = dict(a=1, b=2) print('<' + ', '.join([ '%s=%s' % (k, v[k]) for k in v.keys() ]) + '>') #=> '<a=1, b=2>'
使字节成为 unicode 字符串
从文件或套接字读取的数据(以二进制模式打开)是字节字符串,因此如果不将其解释为 unicode 字符串,将无法以字符为单位进行操作。Python2系列(2.7等)中区分str(字节串)和unicode(字符串),在Web应用等期望输入多字节字符的场景中,最好把字符串当作unicode对象... 使用一种方法将字节字符串解释为具有指定编码的 unicode 字符串decode()。
Python3系列中strtype为字符串类型(对应Python2系列unicode类型),bytestype为byte字符串类型(对应Python2系列str类型)。
with open('u;, 'rb') as fh: # rbなのでバイナリモード byte_content = () # ぜんぶ読み込む, この時点ではバイト列 print(len(byte_content)) # バイト数 unicode_string = by('utf-8') # utf-8エンコーディングで、文字の並びとして解釈 print(len(unicode_string)) # 文字数
decode()该方法的默认编码是,utf-8如果您知道要解释的字节字符串的编码是 UTF-8,则可以省略编码。
bytes_data = b'\xe3\x83\x90\xe3\x82\xa4\xe3\x83\x88\xe5\x88\x97' prin()) # => 'バイト列'
日语中常用的编码如下所示。
- utf_8UTF-8(别名utf-8 U8 utf8 cp65001:)
- shift_jisShift JIS(也称为csshiftjis shiftjis sjis s_jis:)
- cp932Shift JIS(扩展移位 JIS)(也称为932 ms932 mskanji mks-kanji:)
- euc_jpEUC-JP(也称为eucjp ujis u-jis:)
- iso2022_jpcsiso2022jp iso2022jp iso-2022-jpJIS (ISO-2022-JP ) (别名:)
Python 支持的其他编码codecs可以在包页面找到:https ://docs.python.org/ja/3/library/codecs.html
将 unicode 字符串转换为字节
相反,当写入文件或套接字(以二进制模式打开)时,字符串必须是字节字符串。在这种情况下,使用unicode object的encode()方法。
unicode_string = u'マルチバイト文字の文字列' with open('./u;, 'wb') as fh: # 書き込み+バイナリモードでopen byte_content = unicode_('utf-8') # utf-8エンコーディングで表現した場合のバイト列を取得 (byte_content) # バイト列を書き込み
encode()utf-8该方法也表现得好像它是在没有传递编码的情况下传递的。
str_data = 'バイト列' prin()) # => b'\xe3\x83\x90\xe3\x82\xa4\xe3\x83\x88\xe5\x88\x97'