这是菜鸟学Python的第109篇原创文章
阅读本文大概需要2分钟
小白学文本分析即将到来,文本分析肯定离不开字符串,前面热身写了一篇玩转字符串上篇【秘籍总结】玩转Python里的字符串|上篇,今天就把下篇分享给大家,字符串里面的技巧非常多。热身完之后,我们就要跑步进入下一个主题,后面还有好多好玩有趣的东西,让我们继续前行~~
1
字符串替换
字符串的替换,这个话题很多小伙伴说,这不是很简单吧,未必哦,比如下面一段文本:假如有一个data.txt
要求:
-
把日期Thu 09 21 2016 改为 2016/09/21/Thu
-
把时间19:58:06.779 去掉尾部的毫秒
解决第一个问题:
这是一个非常典型的文本处理的需求,无论你是作数据分析还是作自然语言处理,第一步都是要对不规则的数据进行预处理,怎么办呢我们接着往下看:
1).读取数据
text=open('data.txt',encoding='utf-8').read()
print (text)
>>
Thu 09 21 2016 19:58:06.779 <kernel> en0: Received EAPOL packet (length = 161)
Thu 09 22 2015 20:58:16.779 <kernel> inputEAPOLFrame: 0 extra bytes present in EAPOL frame.
Thu 10 13 2016 19:58:26.779 <kernel> inputEAPOLFrame: decrypting key data
Thu 08 24 2017 13:58:36.779 <kernel> inputEAPOLFrame: Received message 1 of 2
Thu 04 21 2017 15:28:06.779 <kernel> installGTK: setting cipher key (flags = 0x0)
Thu 05 09 2017 11:58:06.779 <kernel> GTK-RSC:
<class 'str'>
是一个包含回车键的多行长字符串
2).用正则处理
万能的正则是处理字符串的利器,因为正则非常强大,基本都是一行搞定!(当然我们后面会讲用神库NLTK来分词处理),但是前提还是需要用正则对数据进行清洗.
因为日期是Thu 09 21 2016,我们不能简单的替换,每一行文本的日期都不一样,我们必须要分段去匹配,然后再重新排序替换.是不是有聪明的小伙伴已经想到了,对用re.sub
w{3}表示星期几 3个字母
d{2}表示2个数字,可以匹配月,日
d{4}表示4个数字,可以匹配年
然后我们把匹配的每一个group重新排序r'4/2/3/1',4表示匹配到的第4组(年份),2表示匹配到的月份,3表达匹配到的日期,1其实就是星期,然后我们重新排序用'/'连接
>>
解决第二个问题:
我们需要把每一行里面的19:58:06.779毫秒去掉,可以在上面的基础继续修改一下,增加对时间的匹配(d{2}:d{2}:d{2})(.d{3})
>>
是不是感觉非常简洁,正则的强大往往在于能用极少的代码解决复杂的问题!那么除了上面的方法之外还有没有其他的路子呢
上面的文本很容易转成列表,列表又很容易可转成pandas的series,转成series有什么用呢,非常有用. Pandas里面有非常多的内置函数可以方便的对字符串进行矢量化的处理,其中就包含字符串替换.
比如:有一段文本:
这个文本存入了列表中,每一行都有类似这样的日期时间:"Monday 07 19 2017",我们想替换成2017/07/19/Mon,这么办呢,除了上面第一招之外,现在讲第二招.
1).pandas化文本
data=pd.Series(texts)
print (data)
>>
0 Monday 07 19 2017: The doctor's appointment is...
1 Tuesday 07 20 2017: The dentist's appointment ...
2 Wednesday 07 21 2017: At 7:00pm,there is a bas...
3 Thursday 07 23 2017: Be back home by 11:15 pm ...
4 Friday 07 24 2017: Take the train at 08:10 am,...
2).用Series里面的强大的str属性
下面是pandas里面的series.str的所以属性,是不是看的有点眼熟,对的跟字符串里面很像,但是又加了一些新的东西.(DataFrame也有str作用类型)
3).用replace轻松搞定
-
先设定一个匹配的正则规则,类似前面的(w+b) (d{2}) (d{2}) (d{4})
-
然后我们希望把匹配到的groups,即返回的列表重新排序,并且把星期进行截断前3个字符
看一下结果:
>>
["2017/07/19/Mon: The doctor's appointment is at 2:45pm."
"2017/07/20/Tue: The dentist's appointment is at 11:30 am."
'2017/07/21/Wed: At 7:00pm,there is a basketball game!'
'2017/07/23/Thu: Be back home by 11:15 pm at the lastest.'
'2017/07/24/Fri: Take the train at 08:10 am,arrive at 09:00am.']
2
字符串的删除
字符串的删除其实和替换有一点类似,比如你可以替换为空字符,相当于删除.但是稍许不同,我们在文本清洗的时候,会大量用到字符串的删除,下面我们就来看一下常见的技巧.
比如我们有一个杂乱的字符串文本:
s=' ---hello world *** '
print (s.strip('-* '))
>>
hello world
我们只需要把-和*还有空格全部填入到strip里面就可以了,这里两端的杂乱字符就去掉了.但是中间的没有去掉,怎么办呢,接着看
第一种方法有弊端,中间的空格去不掉,还是要用强大的正则
s=' ---hello world *** '
print (re.sub(r'[s*-]+','',s))
>>
helloworld
我们设定一个正则规则,这要是空格,星号,减号一个或者多个全部替换为空,相当于去掉了这些字符
translate在Py2和Py3里面稍为有一些不同,我分别解释一下:
Py2:
假如我们一串乱码'123 This,* is very &good!'我们需要把符合,数字全部去掉
-
我们利用一个非常强大的内置函数translate搞定,但是它有两个入参数
-
第一个是要转换的映射表,第二个是要去掉的表
-
我们可以利用Python2里的string模块,方便的把符号(punctuation),数字(digits) 统统去掉
-
然后把小写字符全部转为大写字符
>>
THIS IS VERY GOOD
Py3:
python3里面的translate只接受一个参数,同样我们有一串乱的字符:
text='Lifetwas likef a box ofrchocolatesn'
>>
Life was like a box of chocolates
结论:
好了,字符串上下两篇已经讲完了,一共5个大点:分割, 拼接, 切片, 替换和删除. 基本掌握这些技巧,打下基础,后面就可以开始学习更高级的文本分析.Pandas原生字符处理非常强大,后面会在文本分析里面补充讲的,大家如果有什么问题,欢迎留言讨论.
菜鸟学Python入门教程大盘点|7个多月的心血总结
同学,学Python真的不能这样学
全网爬取6500多只基金|看看哪家基金最强
用Python破解微软面试题|24点游戏
2道极好的Python算法题|带你透彻理解装饰器的妙用
一道Google的算法题 |Python巧妙破解
长按二维码,关注【菜鸟学python】
来源 | 菜鸟学Python
作者 | xinxin
本文章为菜鸟学Python独家原创稿件,未经授权不得转载
本篇文章来源于: 菜鸟学Python
本文为原创文章,版权归知行编程网所有,欢迎分享本文,转载请保留出处!
你可能也喜欢
- ♥ 如何在python中反转列表11/26
- ♥ 如何在python中获取列表的前几个元素08/14
- ♥ 如何在python中获得唯一采样10/29
- ♥ 如何在python中将数据框转换为ndarray?09/18
- ♥ 如何为python字典添加值08/17
- ♥ Python 基础知识:迭代器以及如何使用它们12/24
内容反馈