本Task知识点:
- 正则表达式——信息提取
- 正则表达式——数字的表示
- 一句话分组绘图
1.正则表达式——信息提取
在本次组队学习中,多次使用了正则表达式的相关函数。正则表达式也确实是工作中经常能用到的,以前一直没有搞透,借此机会深入理解。
首先回顾一下,在Task1中,使用了re.sub()的方式,从字符串中替换和提取所需数据。
re.sub(正则表达式,用来换的str,被查的str)
例如(替换):
a = re.sub(r'hello', 'i love the', 'hello world')
print(a)
输出'i love the world'
hello world里面的hello被 i love the替换
例如(提取):
a = re.sub('(\d{4})-(\d{2})-(\d{2})', r'\2-\3-\1', '2018-06-07')
>>> a
'06-07-2018'
详解可看Task1,重点,就是在正则表达式中,把关键信息用()包起来,然后在第二个参数中,就可以使用“\1”、"\2"等来表示前面第几个括号中的内容。
然后在Task2中,引申了re.match(正则表达式,被查的str)的用法,如果被查的Str可以match正则表达式,就会返回一个match对象,否则就会返回一个None。只要在re.match()后面,加上is not none,就可以用来判断字符串是否满足某格式。再结合lambda函数,就能用来筛选DataFrame。
而如果要实现这个功能,其实也可以使用今天要讨论的re.findall()。语法如下:
re.findall(正则表达式,被查的str)
findall函数会在被查字符串中,搜索所有满足正则要求的字符串,然后将搜索结果以列表的形式输出。如果没有符合要求的,就会返回一个空列表。
上图中,搜索这段话中所有的数字,然后将数字以列表的形式返回。
如果只想返回多少岁,可以这样写,在后面加一个“岁”:
如果只想得到“27”,可以这样写:
在数据分析中,信息提取是最最常见的场景,因此re.findall()是最重要的函数,遇到此场景,可以着重考虑要如何使用re.findall() 实现
-
最后附上正则表达式的常见规则(里面的内容有些反斜杠“\”没有显示,所以有误,需注意)
2. 正则表达式——数字的表示
如果要提取年龄,即提取“岁”前面的数字,正则表达式可以有以下几种写法:
"([0-9]+) 岁"
"(\d+) 岁"
"([1-9][0-9]*) 岁" # 这种最好
前面两种的效果是一样的,但第三种方式最好。因为对于前面两种,“01”、“02”之类的数字,也会被提取为“01”、“02”,而第三种书写方式,可以直接提取成“1”、“2”。
3.一句话分组绘图
plt.figure(figsize=(12,6))
data.groupby("分组列")["观察列"].count().plot(kind="bar")