Jupyter notebook Macos安装/正则表达式/series和list区别及相互转换-2021年12月3日

Jupyter notebook Macos安装

debug:调试
同一个项目的代码放在一个项目下便于查找
下载网址:https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/

series和list的区别

是两种不同的数据类型
series是带有索引的数组
list是一个一维数组

两者可以相互转换
series转换为list:a=S.tolist()
list转换为series:S=Series(a,index=[‘a’,‘b’,‘c’,‘d’,‘e’])
S2=Series(b) #自动以数字为索引

正则表达式

限定符

匹配前一个字符
?: 表示匹配前一个字符1次或者0次,比如used?,我们可以匹配use或者used,即d可有可无
*: 表示匹配前一个字符多次或者0次
+: 表示匹配前一个字符多次

匹配多个字符
先将匹配的字符括起来,再加上限定符
(ab)+ 匹配结果就是abc ababa …

或运算符
a (cat|dog) 匹配结果是a cat 或者a dog

字符类
见上篇总结

将贪婪匹配转换为懒惰匹配
This is a sample text
用<.+>匹配会默认尽可能多的字符
用<.+?>会将贪婪匹配转换为懒惰匹配

实例1:颜色值匹配
匹配文本中出现的所有十六进制RGB颜色值
/#[a-f]{6}\b
实例2:IP地址的匹配
\d+.\d+.\d+.\d+

核心: 模式,规则

是什么字符,重复多少次,在什么位置,有哪些额外的约束

level1 - 固定的字符串
要求:确定字符串中是否有123456

import re
text = '麦叔身高:178,体重:168,学号:123456,密码:9527'
print(re.findall(r'123456', text))

level2 - 某一类字符
要求:找出所有的单个的数字

import re
text = '麦叔身高:178,体重:168,学号:123456,密码:9527'
print(re.findall(r'\d', text))

\d表示任意一个数字,所以1,7,8,1,6,8等都可以匹配到。
\D表示除数字外的所有字符,包括标点符号
\w表示除标点符号以外的所有字符
[]匹配方括号中的任意字符

import re
text = '麦叔身高:178,体重:168,学号:123456,密码:9527'
print(re.findall(r'[高,重,美]', text))

level3 - 重复某一类字符
要求:找所有的数字,比如178,168,123456,9527等
+*?{m}{m,n}{m,}{,n}

import re
text = '麦叔身高:178,体重:168,学号:123456,密码:9527'
print(re.findall(r'\d+', text))

leve4/5 - 组合level2
要求:找出手机号码或者座机号码

text = '麦叔电话是18812345678,他还有一个电话号码是18887654321,他爱好的数字是01234567891,他的座机是:0571-52152166'
print(re.findall(r'\d{4}-\d{8}|1\d{10}', text))#数字重复4次-数字重复8次或者1一个数字重复10次

level6 - 限定位置
要求:在句子开头的手机号码,或座机

text = '18812345678,他还有一个电话号码是18887654321,他爱好的数字是01234567891,他的座机是:0571-52152166'
print(re.findall(r'^1\d{10}|^\d{4}-\d{8}', text))#^匹配字符串的开头

level7 - 内部约束
要求:找出形如barbar, dardar的前后3个字母重复的字符串(后面3个字母和前面3个字母一致)

text = 'barbar carcar harhel'
print(re.findall(r'(\w{3})(\1)', text))#一个字符3次,括号括起来表示一组,(\1)表示这个括号内的内容和前面括号一样

写正则表达式的步骤

以座机电话号码为例
0571-88776655-9527
1.确定模式包含了几个子模式?
3个子模式,用固定字符连接
2.各个部分的字符分类是什么?
\d-\d-\d
3.各个部分如何重复?
第1个子模式重复3-4次,因为有010和021等直辖市的情况
第2个子模式重复7-8次,因为有的地区只有7位电话号码
第3个子模式重复3-4次
限制次数后模式可写成:\d{3,4}-\d{7,8}-\d{3,4}
但是有的座机号没有分机号,所以用或者运算符表示:\d{3,4}-\d{7,8}-\d{3,4}|\d{3,4}-\d{7,8}
4.考虑是否有外部位置限制?
5.考虑是否有内部制约关系?
最终正则表达式形式为:

text = '随机数字:01234567891,座机1:0571-52152166,座机2:0571-52152188-1234'
print(re.findall(r'\d{3,4}-\d{7,8}-\d{3,4}|\d{3,4}-\d{7,8}', text))

语法规则

见上篇总结
组合模式
把多个简单的模式组合在一起,可以是拼接,也可以是二者选其一。
|
()
像上面的座机号码模式

位置
\b 表示单词边界
123\b 表示123必须是某个单词的最后面3位
(?=…) 匹配…出现在之后的位置
(?!..) 匹配…不出现在之后的位置
(?<=…) 匹配…出现在之前的位置
(?<!..) 匹配…不出现在之前的位置
(?()|) 条件语句

import re
text = '麦叔身高:178,体重:168,学号:123456,密码:9527'
print(re.findall(r'(?<=密码.)\d+', text))

注释
(?#…)

标记
flags
i 忽略大小写

import re
text = 'abc,ABC,aBc'
print(re.findall(r'abc', text,flags=re.I))

Python正则模块re的用法

1.查找
search:只返回1个
match:只返回1个,从头开始匹配
以上返回的都是Match对象
findall:返回字符串
finditer:返回Match迭代器

import re
text = 'abc,ABC,aBc'
print(re.search(r'abc', text))
#结果
<re.Match object; span=(0, 3), match='abc'>
text = '麦叔电话是18812345678,他还有一个电话号码是18887654321,他爱好的数字是01234567891,他的座机是:0571-52152166'
m=re.search(r'(\d{4})-(\d{8})', text)
print(m.group())
print(m.group(1))
print(m.group(2))
text = '麦叔电话是18812345678,他还有一个电话号码是18887654321,他爱好的数字是01234567891,他的座机是:0571-52152166'
m=re.match(r'(\d{4})-(\d{8})', text)
print(m)
#输出none

2.替换
sub
subn:告诉我有几个地方被替换

import re
text = 'abc,ABC,aBc'
print(re.sub(r'abc','xxx', text))
#输出
xxx,ABC,aBc
import re
text = 'abc,ABC,aBc'
print(re.subn(r'abc','xxx', text,flags=re.I))
#输出
('xxx,xxx,xxx', 3)

3.分割
split

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值