Python3 From Zero——{最初的意识:002~字符串和文本}
一、使用多个界定符分割字符串
字符串.split(',')形式只适用于单一分割符的情况;多分割符同时应用的时候,可使用re.split()
>>> line = 'asdf fjdk; afed, fjek,asdf, foo' >>> import re >>> re.split(r'[;,\s]\s*', line) ['asdf', 'fjdk', 'afed', 'fjek', 'asdf', 'foo'] 或 >>> re.split(r'(?:;,\s)\s*', line) #须用非捕获形式,否则各个分割符也将出现在列表中 ['asdf', 'fjdk', 'afed', 'fjek', 'asdf', 'foo']
二、字符串开头或结尾匹配
- 思路1:.startswith(str或tuple)、.endswith(str或tuple),用元组形式可匹配多项
- 思路2:切片之后进行对比
- 思路3:使用正则表达式,re.match(r'patterns', str)、re.search(r'patterns$', str)
三、字符串匹配和搜索:re模块,应用正则表达式
re核心步骤就是先使用 re.compile()
编译正则表达式字符串, 然后使用match()
, findall()
或者 finditer()
等方法以提高效率;捕获分组可以使得后面的处理更加简单,因为可以分别将每个组的内容提取出来:
>>> datepat = re.compile(r'(\d+)/(\d+)/(\d+)') >>> >>> m = datepat.match('11/27/2012') >>> m <_sre.SRE_Match object at 0x1005d2750> >>> # Extract the contents of each group >>> m.group()或m.group(0) '11/27/2012' >>> m.group(1) '11' >>> m.group(2) '27' >>> m.group(3) '2012' >>> m.groups() #元组形式列出各分组的值 ('11', '27', '2012')
findall()
方法会搜索文本并以列表形式返回所有的匹配,如果想以迭代方式返回匹配,可以使用 finditer()
方法来代替
>>> for m in datepat.finditer(text): ... print(m.groups()) ... ('11', '27', '2012') ('3', '13', '2013') >>>
四、查找和替换文本
.replace:效率高,每次只能替换一个字符串;re.sub()/re.subn(),后者返回替换后的结果及替换的次数;.strip('=')/.lstrip('*')/.rstrip(' ')可用于支除字符串两端、左端、右端的指定字符
常用到捕获分组形式\N:
>>> re.sub(r'(\d+)/(\d+)/(\d+)', r'\3-\1-\2', '11/27/2016') '2016-11-27' >>> re.subn(r'(\d+)/(\d+)/(\d+)', r'\3-\1-\2', '11/28/2016') ('2016-11-28', 1)
对于更加复杂的情况,可指定一个替换回调函数对分组数据进行处理及格式化:
#!/usr/bin/env python3 #-*- coding=utf-8 -*- import re from calendar import month_abbr yourdate = input('请输入日期dd/mm/yyyy: ') m = re.search(r'(\d+)/(\d+)/(\d+)', yourdate) datepat = re.compile(r'(\d+)/(\d+)/(\d+)') def mon_ch(m): mon_name = month_abbr[int(m.group(2))] return '{:=^10} {:-<5} {:*>8}'.format(m.group(3), mon_name, m.group(1)) #format可作用于任何值,不仅是str print(datepat.sub(mon_ch(m), yourdate))
五、 不区分大小写及多行查找、替换
- re.findall(r'', yourtext, flags=re.I|re.M) #多个flags用|连接
- re.M 或用 \n|. 替换 . 即可实现多行匹配,后者适用性更强
六、字符串连接、合并
优选print('', '', '', sep=':'),其次print(':'.join(str(x) for x in data)),最次使用连接符+;
七、处理字符串中的变量(名转换为值)
Python不支持在字符串中对变量做简单的值替换,可通过format_map()、vars()实现,vars()或locals()是一个显示本地变量与其值的映射表(dict);
test = 'my name is {name}!' name = input('请输入你的姓名:') 'Jack' test.format_map(vars()) 'my name is Jack!'
HADEX_ FROM HELL.