Python字符串操作大师


我们总结了 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)  # => 'Python2.7'

由于是按顺序处理的,即使连接很多也没关系

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?'

嵌入价值

有三种方法可以将变量的值扩展为字符串。也许还有其他我不知道的。

  1. sprintf 风格: '%s, %s' % ('Hello', 'World')
  2. 扩展 sprintf 风格: '%(a)s, %(b)s' % dict(a='Hello', b='World')
  3. 使用格式方法: '{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 = s2.replace('Hello', 'Bye')  #=> 'Bye Bye' 第三引数を指定しなければすべて置換される
print(ss2)
s3 = 'World World'
ss3 = s3.replace('World', 'Hello', 1)  #=> 'Hello World' # 第三匹数で置換する個数を指定
print(ss3)

对于按照某种模式替换字符串等处理,使用re(正则表达式)包的sub方法。

import re
s = 'Hello World'
print(re.sub(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('./test.txt') as fh:
    for line in fh:
        no_line_break_line = line.rstrip()
        # なにかする


# 空白は削除せずに改行だけ削除する
line_with_space = 'line \n'  # 改行の前の空白は削除したくない
print(line_with_space.rstrip('\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'
print(s.count('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('utf8_content_file.txt', 'rb') as fh:  # rbなのでバイナリモード
    byte_content = fh.read()  # ぜんぶ読み込む, この時点ではバイト列
    print(len(byte_content))  # バイト数
    unicode_string = byte_content.decode('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'
print(bytes_data.decode())  # => 'バイト列'

日语中常用的编码如下所示。

  • 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('./utf8_content_file.txt', 'wb') as fh:  # 書き込み+バイナリモードでopen
    byte_content = unicode_string.encode('utf-8')  # utf-8エンコーディングで表現した場合のバイト列を取得
    fh.write(byte_content)  # バイト列を書き込み

encode()utf-8该方法也表现得好像它是在没有传递编码的情况下传递的。

str_data = 'バイト列'
print(str_data.encode()) # => b'\xe3\x83\x90\xe3\x82\xa4\xe3\x83\x88\xe5\x88\x97'
举报
评论 0