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 的join Array 方法(将连接的字符串作为参数),Python 的join str 方法(将列表/元组作为参数),反之亦然,所以如果你对 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 = 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 和 ), 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 " 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 " # 改行の前の空白は削除したくない print(line_with_space.rstrip(" ")) # => "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() ]) + ">") #=> "" 使字节成为 unicode 字符串
从文件或套接字读取的数据(以二进制模式打开)是字节字符串,因此如果不将其解释为 unicode 字符串,将无法以字符为单位进行操作。Python2系列(2.7等)中区分str(字节串)和unicode(字符串),在Web应用等期望输入多字节字符的场景中,最好把字符串当作unicode对象... 使用一种方法将字节字符串解释为具有指定编码的 unicode 字符串decode() 。
Python3系列中str type为字符串类型(对应Python2系列unicode类型),bytes type为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"ã ã ã å " print(bytes_data.decode()) # => "バイト列"
日语中常用的编码如下所示。utf_8 UTF-8(别名utf-8 U8 utf8 cp65001 :)shift_jis Shift JIS(也称为csshiftjis shiftjis sjis s_jis :)cp932 Shift JIS(扩展移位 JIS)(也称为932 ms932 mskanji mks-kanji :)euc_jp EUC-JP(也称为eucjp ujis u-jis :)iso2022_jpcsiso2022jp iso2022jp iso-2022-jp JIS (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"ã ã ã å "
迄今为止你用过时间最长的是什么手机?我用的时间最长的一款手机是苹果6sPlus,用了五年了,除了待机时间短了外,运行速度还是不错的。下面就是我的真实观点,希望可以分享给大家。我刚开始的时候,用的是小灵通,后来用的是什
三星手机为什么那么多人吐槽?买过一台note3,当时也算是旗舰了,和苹果的iphone6差不多同时吧。硬件确实一流,但是系统真是让人无力吐槽。先说那个三星自家研发的typeB接口,怎么用怎么别扭各种闪断和接触
是什么让国产手机卖到了苹果得价格?谢邀!其实从本质上来说,没有哪一个手机厂商不向往苹果这样的营收模式,iPhone手机的制造成本大概维持在2500元到3000元左右,但售价基本都超过了六七千元,Pro版本的产品更是
中国最安全的手机是哪款?最安全的手机当然是华为了,因为在外国的情报收集链中手机窃取是占比超过一半的情报来源,而华为的手机是使用外国硬件最少的并且现在也有了属于咱们国产的手机系统所以华为的安全性是目前最高的
你们觉得拿iPadmini当手机怎么样?iPadmini比同配置的苹果手机便宜很多,以最新的iPadmini5为例,它的价格不到3000块钱,而同配置的iPhoneXR售价接近5000块钱,两者的价格差了一倍。所以不少网
iPhone13ProMax和上一代比较,你会选择哪一款?1外观方面iPhone13ProMax的外观与上一代基本一样,但这一代有了四种不同的配色,分别是深空灰金色银色远空蓝,而上一代iPhone12Pro及ProMax将拥有灰色银色金色
四层别墅,如何搭建无线网?经济型买四个好点的路由器,一层一个进行桥接或无线接入稳定性如果你自己对弱电网络系统不太了解,对于别墅客户还是建议找专业的弱电公司来负责整个弱电系统的规划设计施工,如果你自己比较懂网
小米或收购宝沃博世ESP芯片价格暴涨300倍Uber司机为正式员工获取资质小米或收购宝沃在北京武汉建厂财联社报道,北京市有关方面正在积极推动小米收购宝沃汽车生产资质,将宝沃汽车18万辆产能转入小米汽车项目。同时,由于宝沃汽车工厂现有产能无法满足小
小米11T11TPro价格泄露售价约合37984940元起小米11T11TPro手机目前已经官宣,将于9月15日在海外发布。这两款手机有望分别配备联发科天玑1200高通骁龙888芯片,确认将支持120W有线快充。根据外媒Winfuture
最便宜5GiPhone要来了,全面屏新芯片2016年,苹果发布了小屏旗舰iPhoneSE。尽管iPhoneSE在外观上并没有新意,采用了iPhone5s的外观设计,但其搭载了当时最新的A9处理器。因此被外界称为iPhone
库克掌舵苹果十年11次主持秋季发布会,每天工作超12小时,从未想成乔布斯本文来源时代周报作者杨玲玲前任领导太牛了,继任者该怎样接班?放眼全世界,对于这个问题最有发言权的,莫过于库克。豆瓣上,一位网友在蒂姆库克传书评中写道。接下来,让我们来聊聊激动人心的