您的位置:首页 > 编程语言 > Python开发

Python基础知识(七)--字符串详解

2011-11-18 16:06 711 查看
#字符串是一个序列,因此也是有大小的对象。
#可以使用字符串为参数调用len()函数

#在字符串操作中,+运算符被重载用于字符串连接
#如果需要连接大量字符串,str.join()是一个更好的方法
#该方法以一个序列做为参数(字符串列表或字符串元组)
#并将其连接在一起存放在一个单独的字符串中,
#并将调用该方法的字符串做为分隔符添加在每两项之间
treatises = ["Arithmetica", "conics", "Elements"]
print(" ". join(treatises))                 #Arithmetica conics Elements
print("-<>-".join(treatises))               #Arithmetica-<>-conics-<>-Elements
print("".join(treatises))                   #ArithmeticaconicsElements
#str.join()方法可以与内置的reversed()函数一起使用,以实现对字符串的反转
#"".join(reversed(s)),当然可以通过步距更精确的获取同样的结果s[::-1]
s = "This is a test"
print("".join(reversed(s)))                 #tset a si sihT
print(s[::-1])                              #tset a si sihT
# * 操作符提供了字符串复制功能
s = "=" * 5
print(s)                                    #=====
s *= 2
print(s)                                    #==========
#在用于字符串时,成员操作符in左边的字符串如果是右边字符串的一部分或是相等就返回True
s = "This is a test"
t = "This"
print(t in s)                               #True
#如果需要在某个字符串中打到另一个字符串的位置,有两种方法:
#1.使用str.index()方法,该方法返回子字符串的索引位置,或在失败时返回一个ValueError
#2.使用str.find()方法,该方法返回子字符串的索引位置,或在失败时返回-1
#如果搜索多个索引位置,str.index()通常会产生更干净的代码

def extract_from_tag(tag, line):
opener = "<" + tag + ">"
closer = "</" + tag + ">"
try:
i = line.index(opener)
start = i + len(opener)
j = line.index(closer, start)
return line[start:j]
except ValueError:
return None

def extract_from_tag(tag, line):
opener = "<" + tag + ">"
closer = "</" + tag + ">"
i = line.find(opener)
if i != -1:
start = i + len(opener)
j = line.find(closer, start)
if j != -1:
return line[start:j]
return None

#可以使用单独的字符串做为str.endswith()或str.startswith()的参数
#也可以使用字符串元组做参数
if filename.lower().endswith((".jpg", ".jpeg")):
print(filename, "is a JPEG image")
#如果参数字符串至少有一个字符,并且字符串中的每个字符都符合标准
#is*()(isalpha()、isspace())方法就返回True
#由于is*()调用的是字符Unicode分类,所以不能因为isdigit()返回True
#就判断可以转换成整数
print("\N{Circled digit two}")                  #②
print("\N{Circled digit two}".isdigit())        #True
print(int("\N{Circled digit two}"))             #invalid literal for int() with base 10: '②'
#可以使用str.lstrip()、str.rstrip()、str.strip()来剥离空格
s = "\t no parking"
print(s.lstrip())                               #no parking
print(s.rstrip())                               #     no parking
print(s.strip())                                #no parking
print("[<unbracketed>]".strip("[]{}<>()"))      #unbracketed
#str.replace()方法用来在字符串内进行替换,并返回该副本
#它以两个字符串做为参数
#第一个字符串所有出现均被替换成第二个字符串
#如果第二个字符串为空的话,实际效果是删除所有第一个字符串相同的内容
s = "This*is*a*test"
print(s.replace("*", " "))                      #This is a test
print(s.replace("*", ""))                       #Thisisatest
#通过str.split()方法可以分割字符串
record = "Leo Tolstoy*1828-8-28*1910-11-20"
fields = record.split("*")
print(fields)                                   #['Leo Tolstoy', '1828-8-28', '1910-11-20']
born = fields[1].split("-")
died = fields[2].split("-")
print("lived about", int(died[0]) - int(born[0]), years)
#lived about 82 years
#也可以从fields列表获取年份
year_born = int(fields[1].split("-")[0])

#str.maketrans() and str.translate()
table = "".maketrans("\N{bengali digit zero}"
"\N{bengali digit one}\N{bengali digit two}"
"\N{bengali digit three}\N{bengali digit four}"
"\N{bengali digit five}\N{bengali digit six}"
"\N{bengali digit seven}\N{bengali digit eight}"
"\N{bengali digit nine}", "0123456789")
print("20749".translate(table))                 #20749
print("\N{bengali digit two}07\N{bengali digit four}"
"\N{bengali digit nine}".translate(table))
#20749
#Python还提供了一些其它的库模块提供了字符串相关的功能
#unicodedata/difflib/io/textwrap/string/re

#使用str.format()进行字符串格式化
print("The novel '{0}' was published in {1}".format("Hard Times", 1854))
#The novel 'Hard Times' was published in 1854
#每个替换字段都由花括号中的字段名标识的,如果字段名是简单的整数
#就将被作为传递给str.format()方法的一个参数的索引位置
#名为0的字段被第一个参数代替,名为1的被第二个参数代替
#如果需要格式化的字符串包含花括号,就要将它复写
print("{{{0}}}{1};-}}".format("I'm in braces", "I'm not"))
#{I'm in braces}I'm not;-}
#如果我们试图连接数字和字符串,则会产生TypeError异常
#但用str.format()方法则可以很容易做到这一点
print("{0}{1}".format("The amount due is $", 200))
#The amount due is $200
x = "three"
s = "{0}{1}{2}"
s = s.format("The", x, "tops")
print(s)                                        #Thethreetops
#字段名还可以使用关键字参数
print("{who} turned {age} this year".format(who = "She", age = 88))
#She turned 88 this year
print("The {who} was {0} last week".format(12, who = "boy"))
#The boy was 12 last week
#字段名可以引用集合数据类型如列表,
#这种情况下可以包含一个索引(不是一个分片)来标志数据项
stock = ["paper", "envelopes", "notepads", "pens", "paper clips"]
print("We have {0[1]} and {0[2]} in stock".format(stock))
#We have envelopes and notepads in stock
#字典对象也可以用于str.format()
d = dict(animal = "elephant", weight = 12000)
print("The {0[animal]} weighs {0[weight]}kg".format(d))
#The elephant weighs 12000kg
#也可以存取命名的属性
import math, sys
print("math.pi=={0.pi} sys.maxunicode=={1.maxunicode}".format(math, sys))
#math.pi==3.141592653589793 sys.maxunicode==65535
#从Python3.1开始,忽略字段名成为可能,
#这种情况下Python会自动处理(使用从0开始的数值)
print("{} {} {}".format("Python", "can", "count"))
#Python can count
#当前还在作用范围的局部变量可以通过内置的locals()函数来访问
#该函数会返回一个字典,字典的键是局部变量名,
#值则是对变量值的引用
#映射拆分操作符为**,用来产生一个适合传递给函数的键-值列表
element = "Sliver"
number = 47
print("Element {number} is {element}".format(**locals()))
#Element 47 is Sliver
#将字典拆分提供给str.format()时,允许使用字典的键作为字段名
#这使得字符串格式更容易理解,更易维护
#因为不需要依赖于参数的顺序
#然而,当需要将不止一个参数传递给str.format()
#那么只有最后一个参数才可以使用映射拆分

#转换

#decimal.Decimal有两种方式输出
>>> import decimal
>>> decimal.Decimal("3.4084")
Decimal('3.4084')
>>> print(decimal.Decimal("3.4084"))
3.4084
#第一种方式是其表象形式,提供一个字符串
#该字符串在被Python解释时,重建其表示的对象
#并不是所有对象都提供这种便于重建的表象形式
#如果提供,其形式为包含在尖括号中的字符串
>>> import sys
>>> sys
<module 'sys' (built-in)>
#第二种是以字符串形式对decimal.Decimal进行展示的
#如果某种对象没有字符串表示形式,但又需要使用字符串进行表示
#那么Python将使用表象形式
#Python内置的数据类型都知道str.format()
#在作为参数传递给这一方法时,将返回一个适当的字符串来展示自己
#为自定义类型添加str.format()方法的支持是很直接的
#重写数据类型的通常行为并强制其提供字符串形式或表象形式也是可能的
#这是通过向指定字段中添加conversion指定符来实现的
#目前有三个这样的指定符
# s 用于强制使用字符串形式
# r 强制使用表象形式
# a 强制使用表象形式,但仅限于ASCII字符
print("{0} {0!s} {0!r} {0!a}".format(decimal.Decimal("93.4")))
#93.4 93.4 Decimal('93.4') Decimal('93.4')


#格式规约
#整数、浮点数以及字符串的默认格式通常都足以满足要求,
#但是如果需要实施更精确的控制,我们就可以通过格式规约很容易地实现。

#对于字符串而言,我们可以控制的包括填充字符、
#字段内对齐方式以及字段宽度的最小值与最大值。
#字符串格式规约是使用冒号(:)引入的,
#其后跟随可靠的字符对--一个填充字符与一个对齐字符(<用于左对齐,
#^用于中间对齐,>用于右对齐),之后跟随一个整数值。
#要注意的是,如果指定了一个填充字符,就必须同时指定对齐字符。

>>> s = "The sword of truth"
>>> "{0}".format(s)
'The sword of truth'
>>> "{0:25}".format(s)
'The sword of truth       '
>>> "{0}".format(s)                 #默认格式
'The sword of truth'
>>> "{0:25}".format(s)              #最小宽度25
'The sword of truth       '
>>> "{0:>25}".format(s)             #最小宽度25,右对齐
'       The sword of truth'
>>> "{0:^25}".format(s)             #最小宽度25,居中对齐
'   The sword of truth    '
>>> "{0:-^25}".format(s)            #最小宽度25,居中对齐,添充-
'---The sword of truth----'
>>> "{0:.<25}".format(s)            #最小宽度25,左对齐,添充.
'The sword of truth.......'
>>> "{0:.10}".format(s)             #最大宽度10
'The sword '
#在格式化规约内部包括替换字段是可以的,从而有可计算的格式也是可能的。
>>> maxwidth = 12
>>> "{0}".format(s[:maxwidth])
'The sword of'
>>> "{0:.{1}}".format(s, maxwidth)
'The sword of'
#第一种方法使用了标准的字符串分片
#第二种方法使用内部替换字段

#对于整数,通过格式规约,可以控制填充字符、字段内对齐、符号、最小字段宽度、基数等
#格式规约以冒号开始,其后可以跟随一个可靠的字符对--一个填充字符与
#一个对齐字符(<用于左对齐,^用于居中对齐,>用于右对齐,=用于在符号与数字之间进行填充),
#之后跟随的是可选的符号字符:+表示必须输出符号,-表示只输出负数符号,
#空格表示为正数输出空格,为负数输出符号-。
#再之后跟随的是可选的最小宽度整数值--其前可以使用字符#引导,
#以便获取某种基数进制为前缀的输出(对二进制、八进制、十六进制数值),
#也可以以0引导,以便在对齐时使用0进行填充。
#如果希望输出其他进制数据,而非十进制数,就必须添加一个类型字符--
# b用于表示二进制,o用于表示八进制,x用于表示小写十六进制,X用于表示大写十六进制,
#为了完整性,也可以使用d表示十进制整数。
#此外还有两个其他类型字符:c,表示输出对应的Unicode字符;n,表示以场所第三的方式输出数字。
#填充实例
>>> "{0:0=12}".format(8749203)          #最小宽度12,用0填充,填充位置在符号和数字之间
'000008749203'
>>> "{0:0=12}".format(-8749203)         #最小宽度12,用0填充,填充位置在符号和数字之间
'-00008749203'
>>> "{0:012}".format(8749203)           #最小宽度12,用0填充
'000008749203'
>>> "{0:012}".format(-8749203)          #最小宽度12,用0填充
'-00008749203'
#填充对齐
>>> "{0:*<15}".format(18340427)         #最小宽度15,左对齐,用*填充
'18340427*******'
>>> "{0:*>15}".format(18340427)         #最小宽度15,右对齐,用*填充
'*******18340427'
>>> "{0:*^15}".format(18340427)         #最小宽度15,居中对齐,用*填充
'***18340427****'
>>> "{0:*^15}".format(-18340427)        #最小宽度15,居中对齐,用*填充
'***-18340427***'
#符号字符
>>> "[{0: }] [{1: }]".format(539802, -539802)       #前缀符号或空格
'[ 539802] [-539802]'
>>> "[{0:+}] [{1:+}]".format(539802, -539802)       #必须输出符号
'[+539802] [-539802]'
>>> "[{0:-}] [{1:-}]".format(539802, -539802)       #只有负数输出符号
'[539802] [-539802]'
>>> "[{0:*^-15}] [{1:*^-15}]".format(539802, -539802)   #只有负数输出符号,居中,宽度15,以*填充
'[****539802*****] [****-539802****]'
#类型字符
"{0:b} {0:o} {0:x} {0:X}".format(14613198)          #各种进制表示
'110111101111101011001110 67575316 deface DEFACE'
>>> "{0:#b} {0:#o} {0:#x} {0:#X}".format(14613198)
'0b110111101111101011001110 0o67575316 0xdeface 0XDEFACE'
#为整数指定最大字段宽度是不可能的,这是因为,
#这样做要求数字是可裁剪的,并可能会使整数没有意义。
#如果使用Python3.1,并在格式规范中使用一个逗号,则整数将使用逗号进行分组:
>>> "{0:,} {0:*>13,}".format(int(2.39432185e6))
'2,394,321 ****2,394,321'
#最后一个可用于整数(也可用于浮点数)的格式化字符是n。
#在给定的字符是整数时,其作用与 d 相同;在给定的字符是浮点数时,其作用于 g 相同。
# n 的特殊之处在于,充分考虑了当前的场所,并在其产生的输出信息中使用场所特定的十进制字符与分组字符。
#默认的场所称为C场所,对这种C场所,十进制字符是一个句点,分组字符是一个空字符串。
#在程序的起始处添加下面两行,并将其作为最先执行的语句,通过这种方式,可以充分考虑不同用户的场所:
import locale
locale.setlocale(locale.LC_ALL, "")         #"Chinese_People's Republic of China.936"
x, y = (1234567890, 1234.56)
c = "{0:n}  {1:n}".format(x, y)
print(c)                                    #1,234,567,890  1,234.56
locale.setlocale(locale.LC_ALL, "C")        #'C'
c = "{0:n}  {1:n}".format(x, y)
print(c)                                    #1234567890  1234.56
#虽然n对于整数非常有用,但是对于浮点数的用途有限,因为随着浮点数的增大,
#就会使用指数形式对其进行输出。
#对于浮点数,通过格式规约,可以控制填充字符、字段对齐、符号、最小字段宽度、
#十进制小数点后的数字个数,以及是以标准形式、指数形式还是以百分数的形式输出数字。
#用于浮点的格式规约与用于的格式规约是一样的,只是在结尾处有两个差别。
#在可靠的最小宽度后面,通过写一个句点并在其后跟随一个整数,
#我们可以指定在小数点后跟随的数字个数。
#我们也可以在结尾处添加一个类型字符: e 表示使用小写字母 e 的指数形式,
# E 表示使用大写字母E的指数形式,f 表示标准的浮点形式,
# g 表示“通常”格式--这与f的作用是相同的,除非数字特别大(在这种情况下与 e的作用相同--
#以及几乎与 g 赞同的 G,但总是使用f或E)。
#另一个可以使用的是%--这会导致数字扩大100倍,
#产生的数字结果使用 f 并附加一个%字符的格式输出。
>>> import math
>>> amount = ( 10 ** 3) * math.pi
>>> print("[{0:12.2e}] [{0:12.2f}]".format(amount))         #最小宽度12,小数点后2位
[    3.14e+03] [     3141.59]
>>> print("[{0:*>12.2e}] [{0:*>12.2f}]".format(amount))
[****3.14e+03] [*****3141.59]
>>> print("[{0:*>+12.2e}] [{0:*>+12.2f}]".format(amount))
[***+3.14e+03] [****+3141.59]
#从Python3.1开始,decimal.Decimal数值能够被格式化为floats,
#也能对逗号(,)提供支持,以获得用逗号进行隔离的组。
#在下面这个例子中,由于在Python3.1中不再需要字段免,所以这里将其删除。
>>> import decimal
>>> "{:,.6f}".format(decimal.Decimal("1234567890.1234567890"))
'1,234,567,890.123457'
>>> "{:,.6}".format(decimal.Decimal("1234567890.1234567890"))
'1.23457E+9'
#从Python3.1开始支持对复数的格式化,
#这是通过将复数的实数部分与虚数部分分别作为单独的浮点数进行格式化来实现的:
>>> "{0.real:.3f}{0.imag:+.3f}j".format(4.75917+1.2042j)
'4.759+1.204j'
>>> "{0.real:.3f}{0.imag:+.3f}j".format(4.75917-1.2042j)
'4.759-1.204j'


本文出自 “懒虫之家” 博客,请务必保留此出处http://lazybug.blog.51cto.com/3902575/718165
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: