基础数据类型 -- 字符串
数据类型转换¶
In [1]:
# 将字符串转换成布尔值
In [2]:
bool(""),bool("1")
Out[2]:
In [124]:
# 数字字符串转化成数字
In [125]:
int("998")
Out[125]:
字符串处理¶
In [3]:
# 字符串可进行加+运算和*运算
In [4]:
"1"+"2" # 1和2拼接
Out[4]:
In [5]:
"2"*2 # 两个2拼接
Out[5]:
字符串的索引与切片¶
索引即下标,初始值为0¶
In [7]:
a = "1234567"
In [8]:
a[0]
Out[8]:
In [9]:
a[-1]
Out[9]:
In [10]:
a[7] # 索引越界抛出异常
切片就是通过索引截取字符串的一段,形成新的字符串¶
In [52]:
a = "1234567"
In [12]:
a[0:3] # 从第0个到第3个元素,不包含第3个
Out[12]:
In [13]:
a[0:-1] # -1是最后一个,不包含最后一个
Out[13]:
In [53]:
a[0:] # 全部
Out[53]:
In [14]:
a[:] # 全部
Out[14]:
In [15]:
a[0:5:2] # 加步长
Out[15]:
In [16]:
a[5:0:-2] # 如果索引由前向后,步数是负数或者索引由后向前,步数是正数则不会打印
Out[16]:
字符串的相关函数¶
In [30]:
# 字符串是不可变数据类型,他调用方法会返回一个新的字符串
大小写¶
In [18]:
a = "my Name"
In [17]:
# capitalize()首字母大写
In [19]:
a.capitalize()
Out[19]:
In [20]:
# 函数不会改变原字符串
In [21]:
a
Out[21]:
In [22]:
# swapcase()大小写反转
In [23]:
a.swapcase()
Out[23]:
In [24]:
# title()每个单词的首字母大写
In [25]:
a.title()
Out[25]:
In [26]:
# upper()全部大写
In [27]:
a.upper()
Out[27]:
In [28]:
# lower()全部小写
In [31]:
a.lower()
Out[31]:
编辑¶
In [32]:
# center(n,"*") # 内同居中,总长度为n,长度不足n两边填充*,字符串长度超过n不会改变
In [33]:
a = "me"
In [35]:
a.center(6,"*")
Out[35]:
In [36]:
a.center(1,"*")
Out[36]:
删除两端内容¶
In [37]:
a = " me "
In [38]:
# lstrip()删除字符串前端空白
In [39]:
a.lstrip()
Out[39]:
In [40]:
# rstrip()删除字符串后端空白
In [41]:
a.rstrip()
Out[41]:
In [42]:
# strip()删除字符串两端空白
In [44]:
a.strip()
Out[44]:
In [45]:
# 上面三个函数默认删除空白,可以指定删除的内容
In [46]:
name = "ni shi shuai bi shi ni"
In [47]:
name.strip("nish ") # 删除字符串两端的"n","i","s","h "直至中断
Out[47]:
查找字符串中的元素¶
In [48]:
# find()返回的找到的元素的索引,如果找不到返回-1
In [49]:
name.find("wo")
Out[49]:
In [50]:
name.find("ni") # 只返回第一个找到的索引
Out[50]:
In [54]:
name.find("ni",3,) # 指定起始位置
Out[54]:
In [55]:
name.find("ni",3,10) # 起始位置,终止为止
Out[55]:
In [56]:
# index() 返回的找到的元素的索引,找不到报错。
In [57]:
name.index("wo")
In [58]:
name.index("ni")
Out[58]:
In [59]:
name.index("ni",3,)
Out[59]:
In [60]:
name.index("ni",3,10)
字符串切割¶
In [61]:
#split()以指定元素分割,最终形成一个列表,此列表不含有这个分割的元素。
# 且以字符串中第一个元素分割时,会产生一个空字符串。
In [62]:
a = "abcacbbacabc"
In [63]:
a.split("ab")
Out[63]:
In [64]:
a.split("ab",1) # 指定分割次数
Out[64]:
In [65]:
a.rsplit("ab",1) # 从后向前分割,指定分割次数
Out[65]:
字符串替换¶
In [66]:
a = "abcacbbacabc"
In [67]:
a.replace("ab","AB") # 默认全部替换
Out[67]:
In [68]:
a.replace("ab","AB",1) # 指定替换次数
Out[68]:
字符串中元素出现的次数¶
In [69]:
a = "abcacbbacabc"
In [70]:
a.count("ab")
Out[70]:
In [71]:
a.count("ab",2) # 指定起始位置
Out[71]:
In [72]:
a.count("ab",2,5) # 起始位置,终止位置
Out[72]:
字符串的判断¶
In [73]:
a = "123abc"
In [74]:
b = "123_abc"
In [75]:
c = "abcdef"
In [80]:
d = "123456"
In [76]:
# isalnum() 检查是否字符串由字母或数字组成
In [81]:
a.isalnum(),b.isalnum(),c.isalnum(),d.isalnum()
Out[81]:
In [78]:
# isalpha() 检查字符串只由字母组成
In [82]:
a.isalpha(),b.isalpha(),c.isalpha(),d.isalpha()
Out[82]:
In [83]:
# isdigit() 检查字符串只由数字组成
In [84]:
a.isdigit(),b.isdigit(),c.isdigit(),d.isdigit()
Out[84]:
In [85]:
# endswith('xxx',x,y) endswith 判断是否以xxx结尾 顾头不顾腚
In [86]:
c.endswith('def')
Out[86]:
In [87]:
c.endswith('c',1,3)
Out[87]:
In [88]:
# startswith("xxx",1,4) #startswith 判断是否以开头
In [89]:
c.startswith('abc')
Out[89]:
In [90]:
c.startswith('bc',1)
Out[90]:
字符串的长度¶
In [91]:
a = "0123456"
In [92]:
len(a) # 元素个数而不是最大索引值
Out[92]:
格式化输出¶
使用%格式化¶
In [96]:
"His name is %s"%("V") # 字符串
Out[96]:
In [100]:
"His name is %r"%("V") # 原始数据
Out[100]:
In [97]:
"He is %d years old"%(20) # 整数
Out[97]:
In [98]:
"His height is %f m"%(1.75) # 浮点数
Out[98]:
In [99]:
"His height is %.2f m"%(1.75) # 保留指定位小数
Out[99]:
In [101]:
"Name:%10s Age:%8d Height:%8.2f"%("V",20,1.75) # 指定占位符宽度
Out[101]:
In [102]:
"Name:%-10s Age:%-8d Height:%-8.2f"%("V",20,1.75) # 指定占位符宽度,左对齐
Out[102]:
In [103]:
"I'm %(c)s. I have %(l)d yuan." % {'c':'V','l':1} # 使用字典传值
Out[103]:
format()函数¶
In [104]:
# 使用占位符{}代替占位符%
In [105]:
"{},{}".format("wei",18) # #通过位置替换有多少个{}就要传递多少参数
Out[105]:
In [106]:
"{1},{0},{1}".format("wei",18,)
#通过参数的索引替换{},可以接受不限个参数,参数索引不能超出
Out[106]:
In [107]:
"{name},{age}".format(name="wei",age=18) #通过关键字传参,
Out[107]:
In [109]:
# 传递列表中的元素
p=['wei',18]
'{0[0]},{0[1]}'.format(p) # 0是第一个参数
Out[109]:
In [110]:
#传递字典中的元素
p={"name":"wei","age":18}
'{0[name]},{0[age]}'.format(p)
Out[110]:
In [111]:
# 填充与对齐
#^,<,>分别是居中,左对齐,右对齐。后面带长度
#:后面是填充的字符,只能是一个字符,不指定默认使用空格
In [112]:
"{:>8}".format("1")
Out[112]:
In [113]:
"{:0>8}".format("1")
Out[113]:
In [114]:
"{:0^8}".format("1")
Out[114]:
In [115]:
# 精度
In [116]:
"{:.2f}".format(3.1415926) # .2表示小数点后两位,f表示float
Out[116]:
In [117]:
# 进制
In [118]:
"{:b}".format(10)# 二进制
Out[118]:
In [119]:
"{:d}".format(10)# 十进制
Out[119]:
In [120]:
"{:o}".format(10)# 八进制
Out[120]:
In [121]:
"{:x}".format(10)# 十六进制
Out[121]:
In [122]:
# 千分位分隔符
In [123]:
"{:,}".format(21312324234)
Out[123]:
re模块,正则匹配¶
In [126]:
import re
re.findall()和re.finditer()¶
In [127]:
# re.findall接收表达式和字符串,返回所有满足匹配条件的结果放在列表里
# re.finditer同re.findall,不过re.fanditer将返回一个包含匹配信息的对象放在一个迭代器中。
# 调用group()方法可以得到匹配的字符串
In [128]:
re.findall("a","an apple") # 正则表达式,字符串
Out[128]:
In [129]:
re.finditer("a","an apple")
Out[129]:
In [133]:
for i in re.finditer("p","an apple"):
print(i)
In [132]:
for i in re.finditer("p","an apple"):
print(i.group())
In [134]:
# findall()的优先级查询
In [136]:
re.findall("www\.(baidu|oldboy)\.com","www.baidu.com")
# findall会优先把匹配结果组里内容返回,如果想要匹配结果,取消权限即可
Out[136]:
In [137]:
#在组前加?:即可取消权限
re.findall("www\.(?:baidu|oldboy)\.com","www.baidu.com")
Out[137]:
re.search()和re.match()¶
In [138]:
# re.search函数会在字符串内查找模式匹配,只到找到第一个匹配然后返回一个包含匹配信息的对象,
# 如果字符串没有匹配,则返回None。该对象可以 通过调用group()方法得到匹配的字符串,
# re.match同search,不过他是在字符串开始处进行匹配
In [139]:
re.search("a","an apple")
Out[139]:
In [140]:
re.search("a","an apple").group()
Out[140]:
In [141]:
re.search("b","an apple") # 返回None
In [142]:
re.search("b","an apple").group()
In [144]:
re.match("p","an apple") # 匹配开头
In [145]:
re.match("a","an apple")
Out[145]:
re.split()分割¶
In [146]:
# 接受一个表达式和一个字符串,用匹配到的字符或字符组中的每一个元素去分割字符串,
# 得到一个列表,也可以传递参数,选择分割次数
In [147]:
re.split('[ab]', 'abcd') # 按a或b分割,先分割a,在分割b
Out[147]:
In [148]:
re.split('[ab]', 'abcd',1) # 分割一次
Out[148]:
In [149]:
# split的优先级
# 在匹配部分加上()之后所切出得结果是不同的,
# 没有()的没有保留用来切割的元素,但是有()的能用来切割的元素
# 这个在某些需要保留匹配部分的使用过程是十分重要的
In [150]:
re.split("\d","ef2sf3esq1w21")
Out[150]:
In [151]:
re.split("(\d)","ef2sf3esq1w21") # 保留了切出来的元素,也有切出来的空格
Out[151]:
re.sub和re.subn¶
In [152]:
re.sub("\d","h","1g23g4g5g6",1) # 将/d匹配到的元素替换成h,替换一次
Out[152]:
In [153]:
re.sub("\d","h","1g23g4g5g6") # 默认全部替换
Out[153]:
In [154]:
# subn(),不止返回一个替换后的字符串,还返回了替换次数
In [155]:
re.subn("\d","h","1g23g4g5g6",1)
Out[155]:
In [156]:
re.subn("\d","h","1g23g4g5g6")
Out[156]:
re.compile¶
In [157]:
# 将正则表达式编译成为一个正则表达式对象,再去调用其他方法,参数为待匹配的字符串
In [158]:
obj=re.compile("\d{3}")
In [159]:
obj
Out[159]:
In [161]:
obj.search("123sad124").group()
Out[161]:
In [162]:
obj.findall("123sad124")
Out[162]:
匹配标签¶
In [163]:
# 利用?P<name>的形式给分组起名
# 获取的匹配结果可以直接用group("name")的形式拿到对应的值
In [164]:
ret = re.search("<(?P<name>\w+)>\w+</(?P=name)>","<h1>hello</h1>")
In [165]:
ret
Out[165]:
In [166]:
ret.group("name")
Out[166]:
In [167]:
ret.group()
Out[167]:
In [168]:
# 也可以用\序号来找到对应的组,表示要找到的内容和前面组的内容一致
# 获取的匹配结果可以直接用group(序号)拿到对应的值
In [169]:
ret1=re.search(r"<(\w+)>\w+</\1>","<h1>hello<h1>")
In [170]:
ret.group(1)
Out[170]:
In [171]:
ret.group()
Out[171]: