知行编程网知行编程网  2022-03-08 08:00 知行编程网 隐藏边栏 |   抢沙发  1 
文章评分 0 次,平均分 0.0

这是菜鸟学Python的第109篇原创文章

阅读本文大概需要2分钟



    小白学文本分析即将到来,文本分析肯定离不开字符串,前面热身写了一篇玩转字符串上篇【秘籍总结】玩转Python里的字符串|上篇,今天就把下篇分享给大家,字符串里面的技巧非常多。热身完之后,我们就要跑步进入下一个主题,后面还有好多好玩有趣的东西,让我们继续前行~~




1

字符串替换


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})

字符串可以这么玩

>>

字符串可以这么玩


是不是感觉非常简洁,正则的强大往往在于能用极少的代码解决复杂的问题!那么除了上面的方法之外还有没有其他的路子


2.强大的Pandas处理

上面的文本很容易转成列表,列表又很容易可转成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

字符串的删除


字符串的删除其实和替换有一点类似,比如你可以替换为空字符,相当于删除.但是稍许不同,我们在文本清洗的时候,会大量用到字符串的删除,下面我们就来看一下常见的技巧.

1.strip()方法

比如我们有一个杂乱的字符串文本:

s='  ---hello  world ***   '

print (s.strip('-* '))

>>

hello  world

我们只需要把-和*还有空格全部填入到strip里面就可以了,这里两端的杂乱字符就去掉了.但是中间的没有去掉,怎么办呢,接着看


2.强大的正则

第一种方法有弊端,中间的空格去不掉,还是要用强大的正则

s='  ---hello  world ***   '

print (re.sub(r'[s*-]+','',s))

>>

helloworld

我们设定一个正则规则,这要是空格,星号,减号一个或者多个全部替换为空,相当于去掉了这些字符


3.translate字符的映射

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

本文为原创文章,版权归所有,欢迎分享本文,转载请保留出处!

知行编程网
知行编程网 关注:1    粉丝:1
这个人很懒,什么都没写

发表评论

表情 格式 链接 私密 签到
扫一扫二维码分享