php顺时针怎么打印,php源码怎么搭建文件夹并显示出来?
我给你思路, 用glob()获取根目录文件,然后用is_dir()判断是否为文件,是的话在用glob(),不是的话,直接打印出来,一直循环下去
感觉什么都没学到?
现在大三,把握好剩下的时间,一切都还来得及的。
除了学好学校的课程之外,然后在选择一个方向,系统的学习。比如说Java,.net或者是Python等都是可以的。
目前企业用的最多的就是Java了,很多企业的软件,系统,网站等都是用Java来开发的。
而当下最主流的非Python莫属,语法简单,相对于其他语言来说更容易入门,掌握Python的人并不多,各个公司对Python开发人才还是比较紧缺的。而且随着人工智能,大数据的蓬勃发展,Python的关注度增加了10倍,成为了开发人工智能的最佳语言。
个人更推荐Python,学好学校课程,给自己规划好相应的学习路线。把空余可支配时间充分利用起来,系统学习,等到大四毕业找工作的时候就完全不一样了。以前学习Python的学习大纲,也是利用学校的空余时间来学习的。
1、Python入门基础
2、数据库开发技术
3、web前端
4、Python web开发
5、Python web项目
6、Linux
7、NoSQL
8、数据可视化
9、爬虫技术
10、人工智能
详细的可以到“如鹏网”上了解一下,有网络就可以学习,根据自己时间灵活安排学习进度。每个章节的都有相应的练习题和面试题需要通过录音的方式进行提交,为面试做准备,有新的课程更新了,也是可以继续来学习的。
在校不迷茫,毕业即辉煌!!!
你手机里有哪些逆天的app?
1、藏书馆
读书人的阅读乌托邦
喜欢读电子书的小伙伴怎能少得了藏书馆这个宝藏App,虽然现在评分较低,主要原因还是广告推送较多,导致用户体验下降,但是作为一站式线上读书服务社区,藏书馆仍然是一款非常强大的阅读软件。
这里藏书丰富,提供的都是有价值的经典书籍,同时也提供荐读、导读、帮读、伴读等读书服务,构建了人与书、人与思想、人与人以及人与图书馆连接的枢纽。
2、潮汐
睡眠、专注与冥想的白噪音番茄钟
潮汐绝对是一款宝藏App,极简的设计,没有任何广告推送,界面和图标都给人一种柔和舒适的感觉,每当你劳累,烦躁,失眠时,来潮汐听着舒缓的声音和白噪音,身心都能够得到了极大的平静与放松。
自然声音、冥想练习等海量音频内容,能够帮助你从快节奏的当下抽离,进入另一个平和安静的时空——减少焦虑与压力、保持专注平静、冥想片刻放松思绪,获得更好的睡眠。
3、声昔
有温度的声音社区、语音日记
在声昔你可以用声音轻松记录你的心情和想法,并且如果你愿意,你可以将自己的心情共享到社区,让更多懂你的人知道你在这里,给你支持和肯定。
除了记录和交流之外,还有灵魂画手、声昔闹钟、读过的书、聊电影这些贴心板块,可以与其他小伙伴趣味互动,收获更多的温暖和乐趣。
4、Forest
培养专注高效率的生活习惯
这是一款治疗拖延症 、提升时间效率、戒除手机成瘾的专注神器。
我们每天要花很多时间沉浸在手机世界里,当做其他事情时,也很难长时间专注,如果想要戒除手机瘾,不再做低头族,Forest确实是不错的选择,它能帮助我们建立高效率与专注的生活习惯。
5、一个木函/Cerulean
超简洁的全能工具箱
这个App我真的太爱了,极简的设计,轻量的体积,简单纯粹又不失强大,里面集合了日常、图片处理、设备应用、清理、转码等相关的50多种工具,基本满足了我们在数码生活中的所有需求。
6、开眼/Eyepetizer
汇聚全球的优质短视频聚集地
这个App也很强大,编辑推荐的视频质量都很高,没有低级趣味的短视频,充满创意的视频,总能拓展你的新视野。
旅行运动、创意广告、生活集锦、科普干货等新鲜有趣的视频,除了带来视觉上的惊艳外,更是我们了解这个世界的新方式。
7、幕布
大纲笔记&思维导图 ,帮助你更好地记录与思考
幕布是一款清单式的笔记工具,用更高效的方式和清晰的结构来记录笔记、管理任务、制定工作计划、头脑风暴,帮助你在记录内容的同时,掌握结构化的思维方式,清晰的梳理出内容的脉络,加深头脑印象。
8、番茄ToDo
培养专注习惯,告别拖延
这个App对于自控力差的人很有用。我之前就是个做事拖延、专注度很差的人,用了番茄ToDo后确实改变了很多。
简约风格,将ToDoList和番茄工作法结合,能够让你的一天在计划中有条不紊地度过,功能也很完善,待办清单、番茄钟、到点提醒、工作数据分析展示等等,是专注静心学习提升自我的神器。
9、达目标
打卡签到时间管理计划
有时候我们立下了很多目标,背单词、看书、每天锻炼等等,定目标容易,但长久坚持下去就很难。达目标这个App就能解决这方面的问题,设立目标挑战金,挑战自我,提高自制力,达成目标,养成好习惯。
10、全历史
换个角度看世界
这个App强大又方便,有关于历史的东西可以随时看,中国史、世界史、古迹、著名画家的画作等都有解析介绍,历史知识脉络都理得很清楚,都不用去百度查找浪费时间,用全历史还能学到不少新知识。
11、哔哩哔哩/bilibili
弹幕番剧直播高清视频
小破站就不用我多说了吧,现在应该是大家手机里必备软件了。我就是B站的重度使用者,里面有趣的视频实在太多,追番、鬼畜视频、游戏直播等等,内容实在太丰富了,当然B站也是我们学习新知识的宝地。
12、每日故宫
故宫博物院馆藏每日撷珍,纵览各领域珍贵文物及代表作品
去不了故宫,就来云故宫,欣赏故宫博物馆的馆藏珍品。
这是故宫博物院官方出品,每日甄选一款馆藏珍品,游宋元山水,共访禁城别苑,探寻皇家日常那些令人惊叹的细节,感受传世珍品不竭的历史生命。
13、网易蜗牛读书
每天畅读一小时
主打精品畅读的高品质App,海量优质出版书,每天畅读一小时。
14、小睡眠
白噪音冥想助眠和爱豆哄睡
总是睡不好觉?可以试用下这款App,小睡眠提供白噪音、冥想曲、助眠ASMR、爱豆哄睡、晚安电台、入睡提醒、睡眠监测、梦话录音、闹钟和午休小憩等功能,能够提升我们的睡眠质量,让我们有一个更加健康的生活。
15、中国大学MOOC(慕课)
网易旗下在线学习慕课平台
这里汇集中国顶尖高校的MOOC课程,丰富的学习资源,能够学到以前从未接触到的专业知识。
16、脱水
记录我的小想法
这个App我也是第一次接触到,所以基于好奇也下载体验了一番,App里面有两个星球,我们可以在脱水星分享理性的思考和问题,也可以在水星表达感性的情绪和日常,在这里,我们可以找到属于自己的一片空间和圈子。
17、百词斩
背单词、学英语必备
一款网红背单词App,知友们都在推荐,记单词的效果肯定还是不错的。
18、西窗烛
品味中国诗词之美
很棒的诗词软件,App设计简洁精美,唐诗三百首、宋词三百首、道德经等,各种古文诗词都有收录,还可以赏析创作,学习传统文化,西窗烛真的是一个不错的选择。
19、滴答清单
高效规划工作与生活备忘提醒,日常番茄打卡养成好习惯
一款轻便的待办事项(Todo)、日程管理(GTD)应用,功能齐全,计划表、备忘录、日程清单、笔记、便签、闹钟、日历、番茄钟、在线协作。
制定项目计划、设置会议提醒、 安排行程规划、保持工作专注,还能用于记录备忘、整理购物清单都可以用这款App完成,是高效办公、目标管理、习惯养成及便捷生活的得力助手。
20、白描
文字识别与文件扫描合成PDF工具
白描是一款文字识别软件,拥有批量识别与翻译功能,以及文件扫描功能。专注,专业,准确高效,能够轻松提取图片中文字信息,生成清晰扫描件。
21、Xmind思维导图
专注思维导图,灵感捕捉利器,效率头脑风暴脑图工具
这个App我一直都在使用,确实是一款强大高效的办公软件,它能帮你专注于扩展延伸和梳理。桌面级思维导图引擎,敏捷,强大且稳定,让思维畅游在掌上和指尖,如入无人之境。不论是笔记备忘录,进行学习计划,融合艺术与创造力,让思维清晰可见。
22、MONO猫弄
用有趣定义自己
MONO是有追求年轻人的聚集地,简洁大气小资,在这里,能发现前所未有的好内容,看遍世界上全然不同的生活方式,和有思想有品位的人一起吐槽聊天。 你不知道的有趣内容,高端技能涨姿势,订阅丰富的兴趣专题,你感兴趣的怎么也看不完。
23、0305
天涯共此时
社交软件有很多,这款软件就是一个很特别的存在,极简的风格,无头像、无昵称、无性别,每个人的名字是一颗星星的编号,在不同的主题下聊天,释放自己的情绪,确实很有意思。
24、鹅说
用卡片的形式让你更快更好的获取知识
这是一款不太一样的知识应用,鹅说这种以卡片进行知识分享的方式真的很有创意,每篇内容都是小编们用心整理出来的,有时候是热点,有时候是冷知识,可以利用碎片化的时间,看上几片有意思的分析和科普。
25、一席
听君一席话,胜读十年书
一席提供了一个平台,展示出了知识(分子)和互联网之间的关联,分享不同的见解、体验和对未来的想象,在这里能够学到不少有价值的知识。
26、微信读书
热门小说阅读追书神器
这是一款热门小说阅读追书神器,EPUB的精致书籍排版,你可以随心个性化你的专属阅读风格,同时还可以和好友一起发现优质好书,一起交流阅读感想,在阅读的同时还能兼具社交。
27、每日英语听力
学英语练口语必备
这是一款专注听力提升的App,拥有每天更新的海量听力库,VOA标准、VOA慢速、BBC、六分钟等听力资源每天更新,与拥有海量词库的《欧路词典》无缝集成,内容丰富有趣,提供全面周到的学习方式。
28、扫描全能王
扫描仪PDF、拍文件转word和excel
一款很受欢迎的手机扫描仪,文档管理工具,能自动切除文档背景,生成高清PDF、JPEG或TXT文本,还可以邮件发送、连接打印机、发传真、发微信,多设备查看,智能OCR文字识别,简便易用的文档管理,轻而易举将文档清晰数据化。
29、夸克/Quark
更好的搜索,智能免广告
这款浏览器也有很多知友推荐,简洁的风格,界面非常清爽,但是用户体验好像不是特别好,还需要不断调整优化。
30、印象笔记
你的第二大脑
这是一款效率软件和知识管理工具,可以帮助你简化工作、学习与生活。你可以在手机、电脑、平板、网页等多种设备和平台间,无缝同步每天的见闻、灵感与思考。一站式完成知识信息的收集备份、高效记录、分享、多端同步和永久保存。
31、国家地理
世界,以及其中的一切!
美国《国家地理》杂志推出的App,每天为你奉上国家地理精选的图片,在精美的视觉享受中,轻松汲取一日所需的科普与人文养分。
32、不背单词
真实语境学英语单词
这是一款记忆单词的App,有原声例句和倾听,能够在情景中掌握单词意思;记忆算法智能安排学习,在记忆临界点提醒复习;极简设计、精美壁纸和主题,让你身心愉悦地背单词。
33、图曰
让图片和视频成为作品
这是一款文字图片创作神器,强大的图片编辑功能,五十余种滤镜随意使用,并拥有百万高清图片,百万精彩文案,全部免费使用,同时也拥有强大的视频剪辑和编辑软件,在摄影,摄像,书画、旅行、写作和文玩等领域都能很好的应用。
34、Snapseed
全面而专业的照片编辑工具
是一款由Google 开发的全面而专业的照片编辑工具。拥有29 种工具和滤镜,包括修复、画笔、结构、HDR 和透视等功能,可打开 JPG 和 RAW 文件,可通过精确控制微调所有样式,是很有价值的修图软件。
35、网易公开课
在线学习名校课程
一个汇聚数十万集TED演讲、国内外名校公开课及其他知识性视频的免费知识学习平台,覆盖科学、经济、人文、哲学、艺术等22个领域,满足您的多元学习需求。
36、烧杯BEAKER
用手机来做化学实验
这款化学学习类App,是一款非常有创意的软件,能够将你的手机变成“烧杯”,150多种药剂、300多种神奇的化学反应任你尝试,轻摇手机、滑动手指模拟实验操作,安全、有趣生动、随时随地做各种化学实验。
37、wikiHow
涨知识
一个堪称“万能”的搜索App,涵盖生活的方方面面。只要你想问,它都不会拒绝你,可以说是涨知识必备神器。
38、片场
你的电影旅行指南
这是一款收集影视取景地信息库的App,精心收集国内外经典影视剧的取景地,为跟着电影去旅行的驴友提供详实的目的地资讯,为广大电影爱好者提供从地理角度理解电影的全新角度,体验阅读中的发现乐趣。
39、Keep
跑步健身计步瑜伽
这个运动健身软件我就不多说了,好多小伙伴应该都在使用,它就像一个私人教练,为你的健康身体保驾护航。
40、场库(原V电影)
感悟人生只需一刻钟
这是一款专注于高品质短片分享的App,纯净的视觉体验,每天分享来自全世界的优秀短片,用最直观的的方式带给你感动和震撼。
41、千语千寻
神秘又有趣的陌生人交友软件
一个神秘又有趣的陌生人交友软件,能够查看ta的聊天记录,了解对方的内心世界,让你更容易了解一个人的真实自我和灵魂,这是一款帮你找到灵魂伴侣的交友神器。
42、多邻国Duolingo
零基础英语学习
这是一款学习外语的宝藏软件,提供了30种语言学习课程,能够从识图,听力,书写,口语等方面有针对性的让学习者全面练习自己口语发音,单词、短语的拼写以及纯正英语发音的听力。
43、闹钟Alarmy/使命闹钟
”起床特困户“的救星 避免赖床和小睡,保证按时起床
还在为每天起不了床,只想睡懒觉而苦恼吗?这款闹钟神器,绝对会让你抓狂,拍照解铃、晃动解铃,让你睡意全无。
44、观止
每天一篇精选优质短篇
每天一篇精选优质短篇,不用登录注册,没有复杂的算法,不猜你喜欢,简单到极致,相信优美文字的力量,并乐于坚持。
45、榫卯
发扬和传承中国的国粹艺术
一款学习类游戏,高质量的三维模型,可以三维实时查看、分解经典的27款榫卯结构,精美的设计来呈现适合榫卯结构的木材,巧妙的交互来讲解常用传统木工工具,直观有趣的了解榫卯结构的历史传承和变革。
46、句读
发现文字之美
句子,真的全是句子,严肃的句子,励志的句子,唯美的句子,心动的句子,伤感的句子,每天一句赏心的话,每天拥有一个好心情。
47、Mark
电影清单、观影指南
一款电影清单应用,有观影指南,电影撰稿人推荐好电影;创建自己的电影清单,记录想看、已看、喜欢的电影。
48、柴扉
分享打动人心的事物
简单好用的App,每天都会推荐一首歌、一则语录、一篇文章,每天用十分钟的细碎时光,点燃内心的光明。
49、蜗牛睡眠
超好用的梦话失眠检测神器!
记录梦话与呼噜,分析睡眠状态,形成睡眠分析报告,ASMR睡眠音乐入睡停止,智能闹钟清晨唤醒,搞笑梦话在线分享。
50、录音转文字助手
语音转换文字语音备忘录音机
一款手机录音转换软件,支持录音转换文字与在线翻译功能,可将正在实时录音的内容或上传的音频文件,准确迅速的转换提取为文字,转换后的文字支持编辑、复制、分享、多种文档格式导出等,同时该软件还是一款专业在线翻译软件及录音机软件。
感谢你看完了这篇问答。
如果你觉得有收获,别忘了花 1 秒点个赞哇
编程的前景还好吗?
未来发展趋势分析,编程前景真的很OK,不过掌握一门编程语言却不是很容易。谈一些自己对其的看法吧~
1、最近几年,“人工智能”被谈及的次数越来越多,虽然前期人工智能发展历程中有过两次低谷期,但这些年逐步回归到群众的视野,而且本次却和前两次有很大不同,随着软硬件技术的进步,如今成熟的人工智能产品商业化落地的可能性愈来愈大,2018年7月中旬左右,百度举办的第二届AI开发者大会上宣布了,全球首款L4级无人车“阿波龙”第100辆下线,可能你对“无人驾驶”领域不太熟悉,但是能量产“L4”级车辆,(最高的为L5阶段)在现阶段真的可以说“厉害炸啦”~
2谈到上述我可没有“跑题哈”,人工智能一定是未来的发展趋势,(世界上一直存在以马斯克为代表的“AI威胁论”和以扎克伯格为代表的“AI开放论”),我是抱着积极态度的,人工智能的实现,软硬件方面都需要大量的程序员,国内的优秀的程序员很少,目前这个市场依旧是“供小于需”;供需不平衡导致最直观的表现就是“薪酬”啦,软件开发人员的薪酬就已经比其他行业的平均薪酬要高很多了,如果往人工智能方向发展,年薪50、60万很正常,工作5、6年后100万也并非只是梦想啦;
3、判断每个行业的前景,标准依旧是未来的发展趋势,未来是什么样子,我们虽然不可主宰,但却可以现象,不要让现在固有的认知水平限制了我们的想象力欧~比尔盖茨的“未来屋”很有可能就是未来生活的“标配”~ ~ ~
智联校园 支明学生回答智联校园是智联招聘旗下校园人才交流与大学生职业发展招聘中心,旨在帮助大学生更快更好成长,如果想加入我们结识更多优秀大学生,可以私信留言,智联校园期待你的到来。你是如何学会正则表达式的?
全力以赴地进入数据集是从事数据科学工作的任何人的使命之一。通常,这意味着要进行数字运算,但是当我们的数据集主要基于文本时,我们该怎么办?我们可以使用正则表达式。在本教程中,我们将仔细研究如何在Python中使用正则表达式(regex)。
正则表达式(regex)本质上是文本模式,可用于自动搜索和替换文本字符串中的元素。这可以使清理和使用基于文本的数据集变得更加容易,从而省去了手动搜索大量文本的麻烦。
正则表达式可以在多种编程语言中使用,并且已经存在很长时间了!
不过,在本教程中,我们将学习Python中的正则表达式,因此需要基本熟悉关键的Python概念,例如if-else语句,while和for循环等。在本教程结束时,您将熟悉Python regex的工作原理,并能够使用Python regex模块中的基本模式和功能re来分析文本字符串。您还将获得有关正则表达式如何与熊猫配合使用以处理大型文本语料库的介绍。
让我们深入研究有关每个人最不喜欢的电子邮件类型的一些数据:垃圾邮件和欺诈。
我们的任务:分析垃圾邮件
在本教程中,我们将使用Kaggle的欺诈电子邮件语料库。它包含1998年至2007年之间发送的数千种网络钓鱼电子邮件。它们非常有趣,易于阅读。
您可以在这里找到完整的语料库。但是,我们将从使用一些电子邮件学习基本的正则表达式命令开始。如果需要,您也可以使用我们的测试文件,也可以在完整的语料库中尝试使用。
介绍Python的Regex模块
首先,我们将通过打开测试文件,将其设置为只读并读取来准备数据集。我们还将其分配给变量fh(用于“文件句柄”)。
请注意,我们在目录路径之前加r。此技术将字符串转换为原始字符串,这有助于避免某些机器读取字符的方式引起的冲突,例如Windows上目录路径中的反斜杠。
现在,假设我们要找出电子邮件的来源。我们可以自己尝试使用原始Python:
但这并没有给我们确切的需求。如果您看一下我们的测试文件,我们可以找出原因并修复它,但是,让我们使用Python的re模块并使用正则表达式来做吧!
我们将从导入Python的re模块开始。然后,我们将使用一个名为的函数re.findall(),该函数返回在正在查看的字符串中定义的模式的所有实例的列表。
外观如下:
这与原始Python的长度基本相同,但这是因为这是一个非常简单的示例。您尝试做的越多,Python正则表达式就可以为您节省更多的精力。
在继续之前,让我们仔细看看re.findall()。此函数采用形式为的两个参数re.findall(pattern, string)。在这里,pattern代表我们要查找的子字符串,并string代表我们要在其中查找的主字符串。主字符串可以包含多行。在这种情况下,我们让它fh使用选定的电子邮件来搜索所有文件。
该.*是一个字符串模式的简写。正则表达式通过使用这些速记模式来查找文本中的特定模式而起作用,因此让我们看一下其他一些常见示例:
常见的Python正则表达式模式
我们re.findall()上面使用的模式包含一个完整拼写的字符串"From:"。当我们确切地知道我们要查找的内容(精确到实际字母以及它们是否为大写或小写)时,这很有用。如果我们不知道我们想要的字符串的确切格式,我们将会迷路。幸运的是,正则表达式具有解决此情况的基本模式。让我们看看在本教程中使用的那些:
1)w匹配字母数字字符,表示az,AZ和0-9。它还与下划线_和破折号-相匹配。
2)d 匹配数字,表示0-9。
3)s 匹配空白字符,包括制表符,换行符,回车符和空格字符。
4)S 匹配非空格字符。
5).匹配除换行符外的任何字符n。
掌握了这些正则表达式模式后,您将在继续进行解释的同时快速理解上面的代码。
使用正则表达式模式
现在,我们可以.*在re.findall("From:.*", text)上面的行中解释的用法。让我们.先来看:
通过在.旁边添加一个From:,我们可以在其旁边查找另一个字符。因为.查找除以外的任何字符n,所以它捕获了我们看不到的空格字符。我们可以尝试更多的点来验证这一点。
看起来加点确实为我们获得了线的其余部分。但是,这很繁琐,而且我们不知道要添加多少点。这是星号符号*出现的位置。
*匹配模式左侧的零个或多个实例。这意味着它将寻找重复模式。当我们寻找重复的模式时,我们说搜索是“贪婪的”。如果我们不寻找重复的模式,则可以将搜索称为“非贪婪”或“懒惰”。
让我们构建一个贪婪的搜索.用*。
因为*匹配在其左侧指示的模式的零个或多个实例,并且.位于此处的左侧,所以我们能够获取From:字段中的所有字符,直到行尾。这将用精美简洁的代码打印出整行。
我们甚至可以更进一步,仅隔离名称。让我们使用它re.findall()来返回包含模式的行列表,"From:.*"就像之前一样。match为了整洁,我们将其分配给变量。接下来,我们将遍历列表。在每个循环中,我们将re.findall再次执行,匹配第一个引号以仅选择名称:
注意,我们在第一个引号旁边使用了反斜杠。反斜杠是一个特殊字符,用于转义其他特殊字符。例如,当我们想将引号用作字符串文字而不是特殊字符时,可以使用反斜杠将其转义,例如:\"。如果我们不使用反斜杠转义上面的模式,它将变为"".*"",Python解释器将其读取为两个空字符串之间的句点和星号。它将产生错误并破坏脚本。因此,至关重要的是我们在这里用反斜杠将引号引起来。
匹配第一个引号后,.*获取行中的所有字符,直到下一个引号也被转义为模式。这使我们得到的名称只是带引号的名称。该名称也打印在方括号中,因为re.findall返回的匹配项在列表中。
如果我们想要电子邮件地址怎么办?
看起来很简单,不是吗?仅模式不同。让我们来看一看。
这是我们仅匹配电子邮件地址的前部分的方式:
电子邮件总是包含一个@符号,因此我们从它开始。电子邮件中@符号前的部分可能包含字母数字字符,这w是必需的。但是,由于某些电子邮件包含句点或破折号,所以这还不够。我们添加S以查找非空白字符。但是,w\S只会得到两个字符。添加*以查找重复。因此,模式的前部如下所示:\w\S*@。
现在查看@符号后面的模式:
域名通常包含字母数字字符,句点和短划线,因此a .可以。为了使它更贪婪,我们使用扩展了搜索范围*。这使我们可以匹配任何字符,直到行尾。
如果我们仔细观察这条线,会发现每封电子邮件都封装在尖括号<和>中。我们的模式.*包括右括号>。让我们对其进行补救:
电子邮件地址以字母数字字符结尾,因此我们将模式设置为w。因此,在@符号后面有.*\w,这表示我们想要的模式是一组以字母数字字符结尾的任何类型的字符。不包括>。
因此,我们的完整电子邮件地址格式如下所示:\w\S*@.*\w。
!这需要花费很多时间。接下来,我们将介绍一些通用re功能,这些功能在开始重新组织语料库时将非常有用。
常用的Python正则表达式函数
re.findall()无疑是有用的,但它不是我们可以使用的唯一内置函数re:
1)re.search()
2)re.split()
3)re.sub()
在使用它们为我们的数据集添加一些顺序之前,让我们一一看一下。
研究()
While re.findall()匹配字符串中某个模式的所有实例并在列表中返回它们,re.search()匹配字符串中一个模式的第一个实例,并将其作为re匹配对象返回。
像一样re.findall(),re.search()也有两个参数。第一个是要匹配的模式,第二个是要在其中找到模式的字符串。在这里,我们将结果分配给match变量以保持整洁。
由于re.search()返回re匹配对象,因此无法通过直接打印来显示名称和电子邮件地址。相反,我们必须首先对该group()函数应用该函数。我们已经在上面的代码中打印了这两种类型。如我们所见,group()将match对象转换为字符串。
我们还可以看到,打印match显示的属性超出字符串本身,而打印match.group()仅显示字符串。
re.split()
假设我们需要一种快速的方法来获取电子邮件地址的域名。我们可以通过三个正则表达式操作来做到这一点,如下所示:
第一行很熟悉。我们返回一个字符串列表,每个字符串包含From:字段的内容,并将其分配给变量。接下来,我们遍历列表以查找电子邮件地址。同时,我们循环访问电子邮件地址,并使用该re模块的split()功能将每个地址切成两半,用@符号作为分隔符。最后,我们打印它。
re.sub()
另一个方便的re功能是re.sub()。就像函数名称所暗示的那样,它替换字符串的一部分。一个例子:
我们之前已经在第一行和第二行看到了任务。在第三行,我们re.sub()在上应用address,这是From:电子邮件标题中的完整字段。
re.sub()需要三个参数。第一个是要替换的子字符串,第二个是我们要替换的字符串,第三个是主字符串本身。
正则表达式与pandas
现在,我们掌握了Python正则表达式的基础知识。但是通常对于数据任务,我们实际上并没有使用原始的Python,而是使用了pandas库。现在,将我们的正则表达式技能带入熊猫工作流程,将其提升到一个新的水平。
如果您以前从未使用过熊猫,请不要担心。我们将逐步遍历代码,以免您迷路。但是,如果您想更详细地了解熊猫,请查看我们的熊猫教程或我们提供的有关numpy和熊猫的完全交互式课程。
使用Python Regex和Pandas对电子邮件进行排序
我们的语料库是一个包含数千封电子邮件的单个文本文件(不过,同样,在本教程中,我们使用的是一个只有两个电子邮件的较小文件,因为在整个语料库上打印正则表达式工作的结果会使这篇文章过长)。
我们将使用正则表达式和熊猫将每封电子邮件的各个部分分类为适当的类别,以便可以更轻松地阅读或分析语料库。
我们将每封电子邮件分为以下类别:
1)sender_name
2)sender_address
3)recipient_address
4)recipient_name
5)date_sent
6)subject
7)email_body
这些类别中的每一个都将成为我们的熊猫数据框(即我们的表格)中的一列。这将使我们更轻松地分别处理和分析每个列。
我们将继续处理我们的小样本,但是值得重申的是,正则表达式使我们可以编写更简洁的代码。简洁的代码减少了我们的机器必须执行的操作数量,从而加快了我们的分析过程。使用我们的两封电子邮件的小文件,并没有太大的区别,但是,如果您尝试使用和不使用正则表达式来处理整个语料库,您将开始看到其优势!
准备脚本
首先,让我们导入所需的库,然后再次打开文件。
除了re和之外pandas,我们email还将导入Python的软件包,这将有助于电子邮件的正文。仅使用正则表达式时,电子邮件的主体相当复杂。它甚至可能需要足够的清理才能保证有自己的教程。因此,我们将使用完善的email软件包来节省一些时间,让我们专注于学习正则表达式。
我们还创建了一个空列表emails,用于存储字典。每本词典将包含每封电子邮件的详细信息。
现在,让我们开始应用正则表达式!
注意:为简洁起见,我们剪裁了上面的打印输出。如果您在自己的机器上打印此文件,它将显示其中包含的所有内容,contents而不是...像上面那样结束。
我们使用re模块的split函数将整个文本块分割fh为单独的电子邮件列表,然后将其分配给变量contents。这很重要,因为我们希望通过使用for循环遍历列表来逐一处理电子邮件。但是,我们如何知道按字符串分割"From r"?
我们之所以知道这一点,是因为在编写脚本之前我们已经查看了文件。我们不必细读其中的数千封电子邮件。只是前几个,看看数据的结构是什么样子。只要有可能,最好在开始使用代码之前先关注实际数据,因为您经常会发现诸如此类的有用功能。
我们已经截取了原始文本文件的屏幕截图:
电子邮件以“ From r”开头
绿色方框是第一封电子邮件。蓝色方框是第二封电子邮件。如我们所见,这两封电子邮件均以开头"From r",并以红色框突出显示。
我们在本教程中使用欺诈电子邮件语料库的原因之一是,当数据杂乱无章,不熟悉且没有文档时,我们不能仅仅依靠代码来整理数据。这将需要一双人眼。正如我们刚刚显示的,我们必须研究语料库本身以研究其结构。
像这样杂乱无章的数据可能需要大量清理。例如,即使我们使用本教程将要构建的完整脚本来计算此集合中的3977封电子邮件,但实际上还有更多。某些电子邮件实际上并不以开头"From r",因此不会单独计算。(不过,为了简洁起见,我们将继续处理该问题,并用分隔所有电子邮件"From r"。)
还要注意,我们contents.pop(0)用来摆脱列表中的第一个元素。这是因为"From r"字符串在第一封电子邮件之前。拆分该字符串后,它将在索引0处生成一个空字符串。我们将要编写的脚本是为电子邮件设计的。如果我们尝试在空字符串上使用它,则可能会引发错误。摆脱空字符串可以使我们避免破坏脚本。
使用For循环获取每个名称和地址
接下来,我们将使用contents列表中的电子邮件。
在上面的代码中,我们使用for循环来遍历,contents因此我们可以依次处理每封电子邮件。我们创建了一个词典,emails_dict其中包含每封电子邮件的所有详细信息,例如发件人的地址和姓名。实际上,这些是我们发现的第一批物品。
这是一个三步过程。首先从寻找From:领域开始。
在第1步中,我们From:使用re.search()函数查找整个字段。该.装置除了任何字符n,并且*其延伸到行的结尾。然后,我们将其分配给变量sender。
但是,数据并不总是那么简单。它可能包含惊喜。例如,如果没有From:字段怎么办?该脚本将引发错误并中断。我们在步骤2中避免了这种情况下的错误。
为了避免由于缺少From:字段而导致的错误,我们使用一条if语句来检查sendernot None。如果是,我们分配s_email和s_name的值,None以便脚本可以继续运行而不是意外中断。
如果您在自己的文件中使用本教程,则可能已经意识到使用正则表达式会变得混乱。例如,这些if-else语句是在编写主体时对主体使用反复试验的结果。编写代码是一个反复的过程。值得注意的是,即使本教程看起来很简单,实际实践也需要进行更多的实验。
在第2步中,我们使用之前的regex模式\w\S*@.*\w,该模式与电子邮件地址匹配。
我们将对名称使用其他策略。每个名称都由左侧:子字符串的冒号()"From:"和<右侧电子邮件地址的左尖括号()界定。因此,我们使用它:.*<来查找名称。我们摆脱:并<从每个结果的时刻。
现在,让我们打印出代码的结果以查看它们的外观。
同样,我们有匹配对象。每次我们将re.search()字符串应用于字符串时,都会生成匹配对象。我们必须将它们变成字符串对象。
我们这样做之前,记得,如果没有From:现场,sender将具有的价值None,因此也将s_email和s_name。因此,我们必须再次检查这种情况,以便脚本不会意外中断。让我们看看如何首先构建代码s_email。
在步骤3A中,我们使用一条if语句检查s_emailnot None,否则它将引发错误并破坏脚本。
然后,我们只需将s_emailmatch对象转换为字符串并将其分配给sender_email变量。我们将其添加到emails_dict字典中,这将使我们日后将细节转换为pandas数据框变得异常容易。
我们s_name在步骤3B中所做的几乎完全相同。
正如我们以前那样,我们首先检查s_name是不是None在步骤3B。
然后,在将字符串分配给变量之前,我们两次使用re模块的re.sub()函数。首先,我们删除冒号和它与名称之间的所有空白字符。我们:s*用一个空字符串代替""。然后,我们删除空格字符和名称另一边的尖括号,再次用空字符串替换它。最后,在将字符串分配给之后sender_name,我们将其添加到字典中。
让我们检查一下结果。
完善。我们已经隔离了电子邮件地址和发件人的姓名。我们还将它们添加到字典中,该字典将很快投入使用。
现在我们已经找到了发件人的电子邮件地址和名称,我们将执行完全相同的步骤来获取字典的收件人的电子邮件地址和名称。
首先,我们找到To:领域。
接下来,我们抢先在场景recipient是None。
如果recipient不是None,则用于re.search()查找包含电子邮件地址和收件人姓名的匹配对象。否则,我们传递r_email和r_name的值None。
然后,将匹配对象转换为字符串并将其添加到字典中。
由于From:和To:字段的结构相同,因此我们可以对两者使用相同的代码。我们需要为其他字段定制略有不同的代码。
获取电子邮件的日期
现在确定发送电子邮件的日期。
我们Date:为From:和To:字段获取具有相同代码的字段。
并且,就像我们对这两个字段所做的一样,我们检查Date:分配给date_field变量的字段是否不是None。
我们已经打印了出来,date_field.group()以便我们可以更清楚地看到字符串的结构。它包括日期,DD MMM YYYY格式的日期和时间。我们只想要日期。日期的代码与姓名和电子邮件地址基本相同,但更为简单。也许唯一令人困惑的是正则表达式模式\d+\s\w+\s\d+。
日期以数字开头。因此,我们用d它来解释它。但是,作为日期的DD部分,它可以是一位或两位数字。在这里+变得重要。在Python正则表达式中,+匹配其左侧1个或多个模式实例。d+因此,无论日期是DD还是一两位数字,它都将与日期的DD部分匹配。
在那之后,有一个空间。这是由占的s,它查找空白字符。因此,该月由三个字母组成w+。然后它撞到另一个空间s。年份由数字组成,因此我们d+再次使用。
完整模式\d+\s\w+\s\d+起作用的原因是它是一个精确的模式,在两侧均以空格字符为界。
接下来,我们None像以前一样检查值。
如果date不是None,则将其从匹配对象转换为字符串,并将其分配给变量date_sent。然后,将其插入字典中。
在继续之前,我们应该注意一个关键点。+并且*看起来相似,但它们可以产生非常不同的结果。让我们以日期字符串为例。
如果使用*,则将匹配零个或多个匹配项。+匹配一个或多个事件。我们已经打印了两种情况的结果。有很大的不同。如您所见,+获取完整日期,而*获取空格和数字31。
接下来,是电子邮件的主题行。
获取电子邮件主题
和以前一样,我们使用相同的代码和代码结构来获取所需的信息。
现在我们对Python正则表达式的使用越来越熟悉了,不是吗?它与以前的代码大致相同,不同之处在于,我们"Subject: "用空字符串代替仅获取主题本身。
获取电子邮件的正文
要插入字典的最后一项是电子邮件的正文。
将标头与电子邮件正文分开是一项非常复杂的任务,尤其是当许多标头以一种或另一种方式不同时。在原始的无组织数据中很少发现一致性。对我们来说幸运的是,这项工作已经完成。Python的email软件包非常擅长此任务。
请记住,我们已经较早导入了该软件包。现在,我们将其message_from_string()功能应用于item,以将完整的电子邮件转换为emailMessage对象。Message对象由标头和有效负载组成,它们分别对应于电子邮件的标头和正文。
接下来,我们将其get_payload()功能应用于Message对象。此功能隔离电子邮件的正文。我们将其分配给变量body,然后将其插入到emails_dict键下的字典中"email_body"。
为什么使用电子邮件软件包而不是正文
您可能会问,为什么使用emailPython软件包而不是regex?这是因为目前还没有很好的方法来处理Python正则表达式,而这不需要大量的清理工作。这意味着可能需要另外一份教程。
值得检查一下我们如何做出这样的决定。但是,我们需要先了解[ ]正则表达式中的方括号,然后才能这样做。
[ ]匹配放置在其中的任何字符。例如,如果我们要查找"a","b"或"c"字符串,则可以将其[abc]用作模式。我们上面讨论的模式也适用。[\w\s]会找到字母数字或空格字符。例外是.,它成为方括号内的文字周期。
现在,我们可以更好地了解我们是如何决定使用电子邮件软件包的。
窥视数据集可发现电子邮件标题在字符串"Status: 0"或处停止"Status: R0",并"From r"在下一封电子邮件的字符串前结束。因此,我们可以Status:\s*\w*\n*[\s\S]*From\sr*用来仅获取电子邮件正文。[\s\S]*适用于大块的文本,数字和标点符号,因为它可以搜索空白或非空白字符。
不幸的是,有些电子邮件包含多个"Status:"字符串,而另一些则不包含"From r",这意味着我们会将电子邮件拆分成多于或少于电子邮件列表中词典的数量。它们与我们已经拥有的其他类别不匹配。使用熊猫时,这会产生问题。因此,我们决定利用该email软件包。
创建词典列表
最后,将字典追加emails_dict到emails列表中:
我们可能要emails在此时打印列表以查看其外观。如果您只是一直在使用我们的小样本文件,那么这将是反高潮的,但是在整个语料库中,您将看到正则表达式的强大功能!
我们还可以print(len(emails_dict))查看列表中有多少个词典,因此还有电子邮件。如前所述,整个语料库包含3977。
这是完整的代码:
如果使用我们的示例文本文件运行它,将会得到以下结果:
我们已经打印出emails列表中的第一项,它显然是带有键和值对的字典。因为我们使用了for循环,所以每个字典都具有相同的键但值不同。
我们已替换为item,"email content here"以便我们不会打印出电子邮件的全部内容并阻塞屏幕。如果您要使用实际数据集在家打印此文件,则会看到整个电子邮件。
用熊猫处理数据
有了列表中的词典,我们使熊猫图书馆的工作变得无比轻松。每个键将成为列标题,每个值将成为该列中的一行。
我们要做的就是应用以下代码:
通过这一行,我们emails使用pandas DataFrame()函数将字典列表转换为数据框。我们也将其分配给变量。
而已。现在,我们有了一个复杂的熊猫数据框。这实际上是一个整洁的表格,其中包含我们从电子邮件中提取的所有信息。
让我们看一下前几行。
该dataframe.head()函数仅显示前几行,而不显示整个数据集。这需要一个论点。一个可选参数允许我们指定要显示多少行。在这里,n=3让我们查看三行。
我们还可以精确地找到我们想要的东西。例如,我们可以找到从特定域名发送的所有电子邮件。但是,让我们学习一种新的正则表达式模式,以提高找到所需项目的精度。
管道符号会|在其任一侧寻找字符。例如,a|b寻找a或b。
|可能看起来与相同[ ],但是它们确实有所不同。假设我们要匹配要么"crab","lobster"或"isopod"。大数据分析Python的正则表达式Regular Expressions使用方法https://www.aaa-cg.com.cn/data/2301.html使用crab|lobster|isopod会比有意义[crablobsterisopod],不是吗?前者将寻找每个单词,而后者将寻找每个字母。
现在,我们|来查找从一个或另一个域名发送的所有电子邮件。
我们在这里使用了相当长的代码。让我们从内而外开始。
emails_df['sender_email']选择标记为的列sender_email。接下来,str.contains(epatra|spinfinder)返回True是否在该列中找到子字符串"epatra"或"spinfinder"。最后,外部emails_df[]返回行的视图,其中该sender_email列包含目标子字符串。好漂亮!
我们也可以查看来自各个单元的电子邮件。为此,我们经历了四个步骤。在步骤1中,我们找到"sender_email"列包含字符串的行的索引"@spinfinder"。注意我们如何使用正则表达式来执行此操作。
在步骤2中,我们使用索引查找电子邮件地址,该loc[]方法作为具有多个不同属性的Series对象返回该电子邮件地址。我们在下面将其打印出来以查看其外观。
在第3步中,我们从系列对象中提取电子邮件地址,就像从列表中提取项目一样。您可以看到它的类型现在是class。
步骤4是提取电子邮件正文的位置。
在步骤4中,emails_df['sender_email'] == "bensul2004nng@spinfinder.com"找到该sender_email列包含value 的行"bensul2004nng@spinfinder.com"。接下来,['email_body'].values查找email_body同一行中的列的值。最后,我们打印出该值。
如您所见,我们可以通过多种方式使用正则表达式,它也可以与大熊猫一起使用!如果您的正则表达式工作包含大量的反复试验,请不要气,,尤其是在您刚刚入门时!
其他资源
自从几年前正则表达式从生物学跃升为工程学以来,正则表达式已取得了巨大的发展。如今,正则表达式已在不同的编程语言中使用,其中除了其基本模式之外还有一些变体。我们已经学习了很多Python正则表达式,并且如果您想将它提高到一个新的水平,那么我们的Python数据清理高级课程可能是一个不错的选择。
您还可以在官方参考资料中找到一些帮助,例如Python 有关其模块的文档re。Google有更快的参考资料。
如果您愿意,也可以开始探索Python regex与其他形式的regex Stack Overflow帖子之间的区别。
如果您需要数据集进行试验,则Kaggle和StatsModels很有用。
最后,这是我们制作的Regex速查表,它也非常有用。
https://www.toutiao.com/i6829923957647344142/