字符串可以这么玩

浏览: 1483

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

1、字符串替换

1.无所不能的正则

字符串的替换,这个话题很多小伙伴说,这不是很简单吧,未必哦,比如下面一段文本:假如有一个data.txt

image.png

要求:

  • 把日期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来分词处理),但是前提还是需要用正则对数据进行清洗.

image.png

因为日期是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其实就是星期,然后我们重新排序用'/'连接

>>

image.png

解决第二个问题:

我们需要把每一行里面的19:58:06.779毫秒去掉,可以在上面的基础继续修改一下,增加对时间的匹配(\d{2}:\d{2}:\d{2})(\.\d{3})

image.png

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

2.强大的Pandas处理

上面的文本很容易转成列表,列表又很容易可转成pandas的series,转成series有什么用呢,非常有用. Pandas里面有非常多的内置函数可以方便的对字符串进行矢量化的处理,其中就包含字符串替换.

比如:有一段文本:

image.png

这个文本存入了列表中,每一行都有类似这样的日期时间:"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作用类型)

image.png

3).用replace轻松搞定


image.png

  • 先设定一个匹配的正则规则,类似前面的(\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) 统统去掉

  • 然后把小写字符全部转为大写字符

image.png

>>

THIS IS VERY GOOD


Py3:

python3里面的translate只接受一个参数,同样我们有一串乱的字符:

text='Life\twas like\f a box of\rchocolates\n'

image.png

>>

Life was like a box of chocolates

结论:


好了,字符串上下两篇已经讲完了一共5个大点:分割, 拼接, 切片, 替换和删除. 基本掌握这些技巧,打下基础,后面就可以开始学习更高级的文本分析.Pandas原生字符处理非常强大,后面会在文本分析里面补充讲的,大家如果有什么问题,欢迎留言讨论.

推荐 0
本文由 菜鸟学Python 创作,采用 知识共享署名-相同方式共享 3.0 中国大陆许可协议 进行许可。
转载、引用前需联系作者,并署名作者且注明文章出处。
本站文章版权归原作者及原出处所有 。内容为作者个人观点, 并不代表本站赞同其观点和对其真实性负责。本站是一个个人学习交流的平台,并不用于任何商业目的,如果有任何问题,请及时联系我们,我们将根据著作权人的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。

0 个评论

要回复文章请先登录注册