1 反转字符串
st="python"
#方法1
''.join(reversed(st))
#方法2
st[::-1]
2 查找第一个匹配串
import re
s = 'i love python very much'
pat = 'python'
r = re.search(pat,s)
print(r.span()) #(7,13)
3 split分割单词
使用多种方法分割单词。分割单词最简单还是使用split
函数。
import re
s = 'This module provides regular expression matching operations similar to those found in Perl'
pat = r'\s+'
r = re.split(pat,s)
print(r) # ['This', 'module', 'provides', 'regular', 'expression', 'matching', 'operations', 'similar', 'to', 'those', 'found', 'in', 'Perl']
### 上面这句话也可直接使用str自带的split函数:
s.split(' ') #使用空格分隔
### 但是,对于风格符更加复杂的情况,split无能为力,只能使用正则
s = 'This,,, module ; \t provides|| regular ; '
words = re.split('[,\s;|]+',s) #这样分隔出来,最后会有一个空字符串
words = [i for i in words if len(i)>0]
4 常用通用字符总结
\s 匹配空白字符
\w 匹配任意字母/数字/下划线
\W 和小写 w 相反,匹配任意字母/数字/下划线以外的字符
\d 匹配十进制数字
\D 匹配除了十进制数以外的值
[0-9] 匹配一个0-9之间的数字
[a-z] 匹配小写英文字母
[A-Z] 匹配大写英文字母
5 常用元字符总结
. 匹配任意字符
^ 匹配字符串开始位置
$ 匹配字符串中结束的位置
* 前面的原子重复0次、1次、多次
? 前面的原子重复0次或者1次
+ 前面的原子重复1次或多次
{n} 前面的原子出现了 n 次
{n,} 前面的原子至少出现 n 次
{n,m} 前面的原子出现次数介于 n-m 之间
( ) 分组,需要输出的部分
6 密码安全检查
密码安全要求:1)要求密码为6到20位; 2)密码只包含英文字母和数字
pat = re.compile(r'\w{6,20}') # 这是错误的,因为\w通配符匹配的是字母,数字和下划线,题目要求不能含有下划线
# 使用最稳的方法:\da-zA-Z满足`密码只包含英文字母和数字`
pat = re.compile(r'[\da-zA-Z]{6,20}')
选用最保险的fullmatch
方法,查看是否整个字符串都匹配:
pat.fullmatch('qaz12') # 返回 None, 长度小于6
7 爬取百度首页标题
import re
from urllib import request
#爬虫爬取百度首页内容
data=request.urlopen("http://www.baidu.com/").read().decode()
#分析网页,确定正则表达式
pat=r'<title>(.*?)</title>'
result=re.search(pat,data)
print(result) #输出实例 <re.Match object; span=(1358, 1382), match='<title>百度一下,你就知道</title>'>
result.group() # 百度一下,你就知道
8 批量转化为驼峰格式(Camel)
数据库字段名批量转化为驼峰格式
import re
def camel(s):
s = re.sub(r"(\s|_|-)+", " ", s).title().replace(" ", "")
return s[0].lower() + s[1:]
# 批量转化
def batch_camel(slist):
return [camel(s) for s in slist]
测试结果:
s = batch_camel(['student_id', 'student\tname', 'student-add'])
print(s)
# 结果
['studentId', 'studentName', 'studentAdd']
转化过程中用到的正则表达式有
# 用到的正则串讲解
# \s 指匹配: [ \t\n\r\f\v]
# A|B:表示匹配A串或B串
# re.sub(pattern, newchar, string): substitue代替,用newchar字符替代与pattern匹配的字符所有.
9 正浮点数
从一系列字符串中,挑选出所有正浮点数。
^[1-9]\d*\.\d*$
注解:
^
表示字符串开始
[1-9]
表示数字1,2,3,4,5,6,7,8,9
^[1-9]
连起来表示以数字 1-9
作为开头
\d
表示一位 0-9
的数字
*
表示前一位字符出现 0 次,1 次或多次
\d*
表示数字出现 0 次,1 次或多次
\.
表示小数点
\$
表示字符串以前一位的字符结束
^[1-9]\d*\.\d*$
连起来就求出所有大于 1.0 的正浮点数。
0.0 到 1.0 间的浮点数:^0\.\d*[1-9]\d*$
因此:两个式子连接起来就是最终的结果:^[1-9]\d*\.\d*|0\.\d*[1-9]\d*$
使用实例:
import re
recom = re.compile(r'^[0-9]\d*\.\d*$')
recom.match('2') #输出为none
##若改为所有正浮点数
import re
recom = re.compile(r'`^[1-9]\d*\.\d*|0\.\d*[1-9]\d*$`')
print(recom.match('000.2') )#输出为none