基础数据类型 -- 字符串

 

数据类型转换

In [1]:
# 将字符串转换成布尔值
In [2]:
bool(""),bool("1")
Out[2]:
(False, True)
In [124]:
# 数字字符串转化成数字
In [125]:
int("998")
Out[125]:
998
 

字符串处理

In [3]:
# 字符串可进行加+运算和*运算
In [4]:
"1"+"2" # 1和2拼接
Out[4]:
'12'
In [5]:
"2"*2  # 两个2拼接
Out[5]:
'22'
 

字符串的索引与切片

 
索引即下标,初始值为0
In [7]:
a = "1234567"
In [8]:
a[0]
Out[8]:
'1'
In [9]:
a[-1]
Out[9]:
'7'
In [10]:
a[7] # 索引越界抛出异常
 
---------------------------------------------------------------------------
IndexError                                Traceback (most recent call last)
<ipython-input-10-8be90b1d10e7> in <module>()
----> 1a[7] # 索引越界抛出异常

IndexError: string index out of range
 
切片就是通过索引截取字符串的一段,形成新的字符串
In [52]:
a = "1234567"
In [12]:
a[0:3] # 从第0个到第3个元素,不包含第3个
Out[12]:
'123'
In [13]:
a[0:-1] # -1是最后一个,不包含最后一个
Out[13]:
'123456'
In [53]:
a[0:] # 全部
Out[53]:
'1234567'
In [14]:
a[:]  # 全部
Out[14]:
'1234567'
In [15]:
a[0:5:2] # 加步长
Out[15]:
'135'
In [16]:
a[5:0:-2] # 如果索引由前向后,步数是负数或者索引由后向前,步数是正数则不会打印
Out[16]:
'642'
 

字符串的相关函数

In [30]:
# 字符串是不可变数据类型,他调用方法会返回一个新的字符串
 
大小写
In [18]:
a = "my Name"
In [17]:
# capitalize()首字母大写
In [19]:
a.capitalize()
Out[19]:
'My name'
In [20]:
# 函数不会改变原字符串
In [21]:
a
Out[21]:
'my Name'
In [22]:
# swapcase()大小写反转
In [23]:
a.swapcase()
Out[23]:
'MY nAME'
In [24]:
# title()每个单词的首字母大写
In [25]:
a.title()
Out[25]:
'My Name'
In [26]:
# upper()全部大写
In [27]:
a.upper()
Out[27]:
'MY NAME'
In [28]:
# lower()全部小写
In [31]:
a.lower()
Out[31]:
'my name'
 
编辑
In [32]:
# center(n,"*") # 内同居中,总长度为n,长度不足n两边填充*,字符串长度超过n不会改变
In [33]:
a = "me"
In [35]:
a.center(6,"*")
Out[35]:
'**me**'
In [36]:
a.center(1,"*")
Out[36]:
'me'
 
删除两端内容
In [37]:
a = "     me    "
In [38]:
# lstrip()删除字符串前端空白
In [39]:
a.lstrip()
Out[39]:
'me    '
In [40]:
# rstrip()删除字符串后端空白
In [41]:
a.rstrip()
Out[41]:
'     me'
In [42]:
# strip()删除字符串两端空白
In [44]:
a.strip()
Out[44]:
'me'
In [45]:
# 上面三个函数默认删除空白,可以指定删除的内容
In [46]:
name = "ni shi shuai bi shi ni"
In [47]:
name.strip("nish ") # 删除字符串两端的"n","i","s","h "直至中断
Out[47]:
'uai b'
 
查找字符串中的元素
In [48]:
# find()返回的找到的元素的索引,如果找不到返回-1
In [49]:
name.find("wo")
Out[49]:
-1
In [50]:
name.find("ni")  # 只返回第一个找到的索引
Out[50]:
0
In [54]:
name.find("ni",3,) # 指定起始位置
Out[54]:
20
In [55]:
name.find("ni",3,10) # 起始位置,终止为止
Out[55]:
-1
In [56]:
# index() 返回的找到的元素的索引,找不到报错。
In [57]:
name.index("wo")
 
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-57-a1f9511612c6> in <module>()
----> 1name.index("wo")

ValueError: substring not found
In [58]:
name.index("ni") 
Out[58]:
0
In [59]:
name.index("ni",3,)
Out[59]:
20
In [60]:
name.index("ni",3,10)
 
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-60-961dc9ce91e1> in <module>()
----> 1name.index("ni",3,10)

ValueError: substring not found
 
字符串切割
In [61]:
#split()以指定元素分割,最终形成一个列表,此列表不含有这个分割的元素。
# 且以字符串中第一个元素分割时,会产生一个空字符串。
In [62]:
a = "abcacbbacabc"
In [63]:
a.split("ab")
Out[63]:
['', 'cacbbac', 'c']
In [64]:
a.split("ab",1) # 指定分割次数
Out[64]:
['', 'cacbbacabc']
In [65]:
a.rsplit("ab",1) # 从后向前分割,指定分割次数
Out[65]:
['abcacbbac', 'c']
 
字符串替换
In [66]:
a = "abcacbbacabc"
In [67]:
a.replace("ab","AB") # 默认全部替换
Out[67]:
'ABcacbbacABc'
In [68]:
a.replace("ab","AB",1) # 指定替换次数
Out[68]:
'ABcacbbacabc'
 
字符串中元素出现的次数
In [69]:
a = "abcacbbacabc"
In [70]:
a.count("ab")
Out[70]:
2
In [71]:
a.count("ab",2) # 指定起始位置
Out[71]:
1
In [72]:
a.count("ab",2,5) # 起始位置,终止位置
Out[72]:
0
 
字符串的判断
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]:
(True, False, True, True)
In [78]:
# isalpha() 检查字符串只由字母组成
In [82]:
a.isalpha(),b.isalpha(),c.isalpha(),d.isalpha()
Out[82]:
(False, False, True, False)
In [83]:
# isdigit() 检查字符串只由数字组成
In [84]:
a.isdigit(),b.isdigit(),c.isdigit(),d.isdigit()
Out[84]:
(False, False, False, True)
In [85]:
# endswith('xxx',x,y) endswith 判断是否以xxx结尾 顾头不顾腚
In [86]:
c.endswith('def')
Out[86]:
True
In [87]:
c.endswith('c',1,3)
Out[87]:
True
In [88]:
# startswith("xxx",1,4)   #startswith 判断是否以开头
In [89]:
c.startswith('abc')
Out[89]:
True
In [90]:
c.startswith('bc',1)
Out[90]:
True
 
字符串的长度
In [91]:
a = "0123456"
In [92]:
len(a) # 元素个数而不是最大索引值
Out[92]:
7
 

格式化输出

 
使用%格式化
In [96]:
"His name is %s"%("V") # 字符串
Out[96]:
'His name is V'
In [100]:
"His name is %r"%("V") # 原始数据
Out[100]:
"His name is 'V'"
In [97]:
"He is %d years old"%(20) # 整数
Out[97]:
'He is 20 years old'
In [98]:
"His height is %f m"%(1.75) # 浮点数
Out[98]:
'His height is 1.750000 m'
In [99]:
"His height is %.2f m"%(1.75) # 保留指定位小数
Out[99]:
'His height is 1.75 m'
In [101]:
"Name:%10s Age:%8d Height:%8.2f"%("V",20,1.75) # 指定占位符宽度
Out[101]:
'Name:         V Age:      20 Height:    1.75'
In [102]:
"Name:%-10s Age:%-8d Height:%-8.2f"%("V",20,1.75) # 指定占位符宽度,左对齐
Out[102]:
'Name:V          Age:20       Height:1.75    '
In [103]:
"I'm %(c)s. I have %(l)d yuan." % {'c':'V','l':1} # 使用字典传值
Out[103]:
"I'm V. I have 1 yuan."
 
format()函数
In [104]:
# 使用占位符{}代替占位符%
In [105]:
"{},{}".format("wei",18) # #通过位置替换有多少个{}就要传递多少参数
Out[105]:
'wei,18'
In [106]:
"{1},{0},{1}".format("wei",18,) 
#通过参数的索引替换{},可以接受不限个参数,参数索引不能超出
Out[106]:
'18,wei,18'
In [107]:
"{name},{age}".format(name="wei",age=18) #通过关键字传参,
Out[107]:
'wei,18'
In [109]:
# 传递列表中的元素
p=['wei',18]
'{0[0]},{0[1]}'.format(p) # 0是第一个参数
Out[109]:
'wei,18'
In [110]:
#传递字典中的元素
p={"name":"wei","age":18}
'{0[name]},{0[age]}'.format(p)
Out[110]:
'wei,18'
In [111]:
# 填充与对齐
#^,<,>分别是居中,左对齐,右对齐。后面带长度
#:后面是填充的字符,只能是一个字符,不指定默认使用空格
In [112]:
"{:>8}".format("1")
Out[112]:
'       1'
In [113]:
"{:0>8}".format("1")
Out[113]:
'00000001'
In [114]:
"{:0^8}".format("1")
Out[114]:
'00010000'
In [115]:
# 精度
In [116]:
"{:.2f}".format(3.1415926) # .2表示小数点后两位,f表示float
Out[116]:
'3.14'
In [117]:
# 进制
In [118]:
"{:b}".format(10)# 二进制
Out[118]:
'1010'
In [119]:
"{:d}".format(10)# 十进制
Out[119]:
'10'
In [120]:
"{:o}".format(10)# 八进制
Out[120]:
'12'
In [121]:
"{:x}".format(10)# 十六进制
Out[121]:
'a'
In [122]:
# 千分位分隔符
In [123]:
"{:,}".format(21312324234)
Out[123]:
'21,312,324,234'
 

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]:
['a', 'a']
In [129]:
re.finditer("a","an apple")
Out[129]:
<callable_iterator at 0x1b50526c0f0>
In [133]:
for i in re.finditer("p","an apple"):
    print(i)
 
<_sre.SRE_Match object; span=(4, 5), match='p'>
<_sre.SRE_Match object; span=(5, 6), match='p'>
In [132]:
for i in re.finditer("p","an apple"):
    print(i.group())
 
p
p
In [134]:
# findall()的优先级查询
In [136]:
re.findall("www\.(baidu|oldboy)\.com","www.baidu.com") 
# findall会优先把匹配结果组里内容返回,如果想要匹配结果,取消权限即可 
Out[136]:
['baidu']
In [137]:
#在组前加?:即可取消权限
re.findall("www\.(?:baidu|oldboy)\.com","www.baidu.com")
Out[137]:
['www.baidu.com']
 

re.search()和re.match()

In [138]:
# re.search函数会在字符串内查找模式匹配,只到找到第一个匹配然后返回一个包含匹配信息的对象,
# 如果字符串没有匹配,则返回None。该对象可以 通过调用group()方法得到匹配的字符串,

# re.match同search,不过他是在字符串开始处进行匹配
In [139]:
re.search("a","an apple")
Out[139]:
<_sre.SRE_Match object; span=(0, 1), match='a'>
In [140]:
re.search("a","an apple").group()
Out[140]:
'a'
In [141]:
re.search("b","an apple") # 返回None
In [142]:
re.search("b","an apple").group()
 
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-142-4ef12f5302f4> in <module>()
----> 1re.search("b","an apple").group()

AttributeError: 'NoneType' object has no attribute 'group'
In [144]:
re.match("p","an apple") # 匹配开头
In [145]:
re.match("a","an apple")
Out[145]:
<_sre.SRE_Match object; span=(0, 1), match='a'>
 

re.split()分割

In [146]:
# 接受一个表达式和一个字符串,用匹配到的字符或字符组中的每一个元素去分割字符串,
# 得到一个列表,也可以传递参数,选择分割次数
In [147]:
re.split('[ab]', 'abcd') # 按a或b分割,先分割a,在分割b
Out[147]:
['', '', 'cd']
In [148]:
re.split('[ab]', 'abcd',1) # 分割一次 
Out[148]:
['', 'bcd']
In [149]:
# split的优先级
# 在匹配部分加上()之后所切出得结果是不同的,
# 没有()的没有保留用来切割的元素,但是有()的能用来切割的元素
# 这个在某些需要保留匹配部分的使用过程是十分重要的
In [150]:
re.split("\d","ef2sf3esq1w21")
Out[150]:
['ef', 'sf', 'esq', 'w', '', '']
In [151]:
re.split("(\d)","ef2sf3esq1w21") # 保留了切出来的元素,也有切出来的空格
Out[151]:
['ef', '2', 'sf', '3', 'esq', '1', 'w', '2', '', '1', '']
 

re.sub和re.subn

In [152]:
re.sub("\d","h","1g23g4g5g6",1) # 将/d匹配到的元素替换成h,替换一次
Out[152]:
'hg23g4g5g6'
In [153]:
re.sub("\d","h","1g23g4g5g6") # 默认全部替换
Out[153]:
'hghhghghgh'
In [154]:
# subn(),不止返回一个替换后的字符串,还返回了替换次数
In [155]:
re.subn("\d","h","1g23g4g5g6",1)
Out[155]:
('hg23g4g5g6', 1)
In [156]:
re.subn("\d","h","1g23g4g5g6")
Out[156]:
('hghhghghgh', 6)
 

re.compile

In [157]:
# 将正则表达式编译成为一个正则表达式对象,再去调用其他方法,参数为待匹配的字符串
In [158]:
obj=re.compile("\d{3}")
In [159]:
obj
Out[159]:
re.compile(r'\d{3}', re.UNICODE)
In [161]:
obj.search("123sad124").group()
Out[161]:
'123'
In [162]:
obj.findall("123sad124")
Out[162]:
['123', '124']
 

匹配标签

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]:
<_sre.SRE_Match object; span=(0, 14), match='<h1>hello</h1>'>
In [166]:
ret.group("name")
Out[166]:
'h1'
In [167]:
ret.group()
Out[167]:
'<h1>hello</h1>'
In [168]:
# 也可以用\序号来找到对应的组,表示要找到的内容和前面组的内容一致
# 获取的匹配结果可以直接用group(序号)拿到对应的值
In [169]:
ret1=re.search(r"<(\w+)>\w+</\1>","<h1>hello<h1>")
In [170]:
ret.group(1)
Out[170]:
'h1'
In [171]:
ret.group()
Out[171]:
'<h1>hello</h1>'
posted @ 2018-03-27 14:27  瓜田月夜  阅读(109)  评论(0)    收藏  举报