一、Python字符串基本操作
1. 去掉前后的特殊字符(strip)
Python的strip
操作可以去除字符串前后的空格(不改变原串
)下例将前后的空格均删掉👇
str = ' 人工智能 '
str.strip() # OUT:'人工智能'
rstrip
删除右边的空格,保留左边的空格:
str.rstrip() # OUT:' 人工智能'
lstrip
删除左边的空格,保留右边的空格:
str.lstrip() # OUT:'人工智能 '
strip还可以指定任意形式的字符,将字符串前后的该字符都删掉
str = 'AAA我爱人工智能AA'
str.strip('A') # OUT:'我爱人工智能'
2. 替换操作(replace)
使用replace把所有的 ’ 我 ’ 改成 ‘你’(替换全部!!):
str = '我爱人工智能,我爱深度学习'
str.replace('我','你') # OUT:'你爱人工智能,你爱深度学习'
使用replace把我替换成None,即相当于删除全部的 ‘ 我 ’:
str = '我爱人工智能,我爱深度学习'
str.replace('我','') # OUT:'爱人工智能,爱深度学习'
3. 查找操作(find操作)
find()方法语法:
str.find(str, beg=0, end=len(string))
str —— 指定检索的字符串
beg —— 开始索引,默认为0。
end —— 结束索引,默认为字符串的长度。
【如果包含子字符串返回开始的
索引值
,否则返回-1。】
str = '我爱人工智能,我爱深度学习'
str.find('爱') # 返回的是第一个出现‘爱’的索引 OUT : 1
4. 判断操作 (is~~~)
isalpha: 如果字符串至少有一个字符并且所有字符都是字母或文字则返回 True,否则返回 False
str = 'a习'
str.isalpha() # OUT : True 但是在后面加个空格就是false了
str = 'a112'
str.isdigit() # OUT:False
5. 分割合并操作
str = '我爱 人工智能,我爱 深度学习'
str.split(' ') # OUT:['我爱', '人工智能,我爱', '深度学习']
上例表示将字符串,按照空格为分隔符,将字符串切分,输出是一个list结构,将分割后的每个结果作为list中的一个元素,但是原始的str仍未改变,仍然是 ‘我爱 人工智能,我爱 深度学习’ , 而非list,要想让原始的str更改为list,则需要自行赋值。
str = str.split(' ') # 现在,str是['我爱', '人工智能,我爱', '深度学习']了
下面将list中的元素进行合并, 同时指定合并时的分隔符 (join
)
' '.join(str) # OUT:'我爱 人工智能,我爱 深度学习'
如果不需要分割符,只需要合并,则将指定分隔符发位置置为空即可。【置为None并不是空格
】
''.join(str) # OUT : '我爱人工智能,我爱深度学习'
二、正则表达式
1. 基本介绍
正则表达式(Regular Expression)是一种文本模式,包括普通字符(例如,a 到 z 之间的字母)和特殊字符(称为"元字符")。正则表达式使用单个字符串来描述、匹配一系列匹配某个句法规则的字符串。正则表达式通常用于数据预处理时对文本进行筛选,获得我们所需要的信息,例如:只要数字、字母。
2. 正则表达式操作
(1)基本匹配操作
Python正则表达式
(1)指定好匹配的模式 —— pattern
(2)选择相应的方法 —— match, search等
(3)得到匹配结果 —— group等
re.match: # 从开始位置开始匹配,如果开头没有则无
re.search: # 搜索整个字符串
re.findall: # 搜索整个字符串,返回一个list
import re
str = '人工智能很简单 。 9abc21567k8'
pattern = re.compile(r'.')
re.findall(pattern, str)
上面表格中提到,‘.’ 可以匹配除 ‘\n’ 外的字符。因此上例中将每个字符都输出出来(list形式)。👇下例展示了可以在[ ]内指定字符进行筛选。
str = '人工智能很简单 。 9abc21567k8'
pattern = re.compile(r'[abc]')
re.findall(pattern, str) # OUT: ['a', 'b', 'c']
可以发现,当需要匹配的字符过多时,都塞在[ ]内肯定不是长久之计,因此这就体现了正则表达式的妙处。
[abc指定包含字符]
[a-zA-Z]来指定所有英文字母的大小写
[^a-zA-Z]不匹配所有的英文字母
str = '人工智能很简单 。 9abc21567k8'
pattern = re.compile(r'[a-zA-Z]')
re.findall(pattern, str) # OUT : ['a', 'b', 'c', 'k']
str = '人工智能很简单 。 9abc21567k8'
pattern = re.compile(r'[^a-zA-Z]')
re.findall(pattern, str)
(2)或方法
或方法,将两个规则并起来,以’|'连接,表示只要满足其中之一就可以匹配。
str = '人工智能很简单 。 9abc21567k8'
pattern = re.compile(r'[a-zA-Z]|[0-9]')
re.findall(pattern, str)
# OUT : ['9', 'a', 'b', 'c', '2', '1', '5', '6', '7', 'k', '8']
3. 正则常用符号
注:\w其实也包括匹配汉字,只是通常都采用英文的字符串。
# 例如:'\d'匹配数字,等价于p [0-9]
str = '人工智能很简单 。 9abc21567k8'
pattern = re.compile(r'\d')
re.findall(pattern, str) # OUT : ['9', '2', '1', '5', '6', '7', '8']
4. 特殊字符
# 0次或多次
str = '人工智能很简单 。 9abc21567k8'
pattern = re.compile(r'\d*')
re.findall(pattern, str)
# OUT : ['', '', '', '', '', '', '', '', '', '', '9', '', '', '', '21567', '', '8', '']
# 1次或多次
pattern = re.compile(r'\d+')
re.findall(pattern, str) # OUT : ['9', '21567', '8']
# 0次或1次
pattern = re.compile(r'\d?')
re.findall(pattern, str)
不仅如此,'{m}'可以精确匹配 m 次:👇
str = '人工智能很简单 。 9abc215k856'
pattern = re.compile(r'\d{3}')
re.findall(pattern, str) # OUT : ['215', '856']
'{m,n}'可以精确匹配最少 m 次, 最多n 次:👇
str = '人工智能很简单 。 9abc215k856'
pattern = re.compile(r'\d{1,3}')
re.findall(pattern, str) # OUT : ['9', '215', '856']
5. match & search
它们的返回不是一个简单的字符串列表,而是一MatchObject,可以得到更多的信息。如果匹配不成功,它们则返回一个NoneType。所以在对匹配完的结果进行操作之前,必需先判断一下是否匹配成功了。
skill:在实际任务中,通常加if判断,如果找到了,再继续,防止NoneType带来奇妙的问题
match 从字符串的开头开始匹配,如果开头位置没有匹配成功,就算失败了;而search会跳过开头,继续向后寻找是否有匹配的字符串。
input = '12人工智能很简单'
pattern = re.compile(r'\d')
match = re.match(pattern, input)
match.group() # OUT : '1'
6. 字符串的替换 & 修改
在目标字符串中规格规则查找匹配的字符串,再把它们替换成指定的字符串。你可以指定一个最多替换次数,否则将替换所有的匹配到的字符串。
sub ( rule , replace , target [,count] )
subn(rule , replace , target [,count] )
第一个参数是正则规则,第二个参数是指定的用来替换的字符串,第三个参数是目标字符串,第四个参数是最多替换次数。
sub返回一个被替换的字符串。
subn返回一个元组,第一个元素是被替换的字符串,第二个元素是一个数字,表明产生了多少次替换。
input = '123人工智能很简单'
pattern = re.compile(r'\d')
re.sub(pattern,'学习' ,input) # OUT : '学习学习学习人工智能很简单'
input = '123人工智能很简单'
pattern = re.compile(r'\d')
re.subn(pattern,'学习' ,input) # OUT : ('学习学习学习人工智能很简单', 3)
SUM: 上例表明,实际上sub和subn几乎一样,只是subn多返回了一个替换的次数。
7. 切片(split)
split切片函数。使用指定的正则规则在目标字符串中查找匹配的字符串,用它们作为分界,把字符串切片。
split( rule , target [,maxsplit])
第一个参数是正则规则,第二个参数是目标字符串,第三个参数是最多切片次数,返回一个被切完的子字符串的列表。
input = '自然语言处理123人工智能456深度学习'
pattern = re.compile(r'\d+')
re.split(pattern, input) # ['自然语言处理', '人工智能', '深度学习']
8. '(?P…)'命名组
'(?P…)'是命名组,其中,<…>里面是给这个组起的名字。
input = '自然语言处理123人工智能456深度学习'
pattern = re.compile(r'(?P<hh>\d+)(?P<uu>\D+)')
m = re.search(pattern, input)
m.group('hh') # OUT : '123'
str = 'number 863-996-785'
pattern = re.compile(r'(\d\d\d-\d\d\d-\d\d\d)')
m = re.search(pattern, str)
m.groups() # OUT : ('863-996-785',)