【Day16-搜寻】茫茫文海当中找到那个对的词——文字处理利器之正规表达式在python的应用

前一天我们就如何让程序可以认得不同的单字稍微讨论了一下一些基本的处理,那今天我们就继续文字的主题来介绍一个在处理文字资料的时候非常强大的工具——正规表示式(又称作正则表示式)

找出不同形态的文字

其实和我们在第14天讲的字串可以透过不同的格式化方式来传入不同类型的变数,反过来我们同样也能透过文字中不同样子的字符来把它们抓出来,各语言的正规表示法可能有一点点不太一样,这边以python为例

基本的替代符号

  • \d:一位数字
  • \D:任意一位不是数字的符号
  • \s:一个空格或换行符号
  • \w:英文字母
  • \W:任意一位不是英文字母的符号
  • [\u4e00-\u9fa5]:一个中文字

一些特别的符号

  • .:一位任意符号
  • *:(必须接在某个符号後面),0个或更多的该符号
  • +:(必须接在某个符号後面),1个或更多的该符号
  • {3,4}:(必须接在某个符号後面),3个~5个的该符号

python中的正规搜寻——re

我们这边以疾病管制署9/29的新闻稿为例

text = """
中央流行疫情指挥中心今(29)日公布国内新增11例COVID-19确定病例,分别为1例本土及10例境外移入;另确诊个案中无新增死亡。

指挥中心表示,今日新增1例本土个案(案16326),为印尼籍30多岁女性,今(2021)年9月27日出现头痛症状,9月28日就医采检,於今日确诊。卫生单位已匡列接触者7人,均列居家隔离,其余接触者匡列中。

指挥中心指出,今日新增10例境外移入个案,为9例男性、1例女性,年龄介於20多岁至40多岁,入境日介於9月3日至9月28日,分别自美国(案16316)、哈萨克(2例,案16317、案16318)、巴基斯坦(案16319)、柬埔寨(16320)、俄罗斯(案16324)及菲律宾(案16325)入境,余3例 (案16321、案16322、案16323)的旅游国家调查中;详如新闻稿附件。

指挥中心统计,截至目前国内累计3,358,228例新型冠状病毒肺炎相关通报(含3,341,439例排除),其中16,216例确诊,分别为1,581例境外移入,14,581例本土病例,36例敦睦舰队、3例航空器感染、1例不明及14例调查中;另累计110例移除为空号。2020年起累计842例COVID-19死亡病例,其中830例本土,个案居住县市分布为新北市412例、台北市318例、基隆市28例、桃园市26例、彰化县15例、新竹县13例、台中市5例、苗栗县3例、宜兰县及花莲县各2例,台东县、云林县、台南市、南投县、高雄市及屏东县各1例;另12例为境外移入。

指挥中心再次呼吁,民众应落实手部卫生、咳嗽礼节及佩戴口罩等个人防护措施,减少不必要移动、活动或集会,避免出入人多拥挤的场所,或高感染传播风险场域,并主动积极配合各项防疫措施,共同严守社区防线。
"""

范例1:找出本土和境外的数量

import re
print(re.search("新增\d+例本土", text)) # re.search找到第一笔匹配的,回传re.Match型态
print(re.findall("新增\d+例境外", text)) # re.findall找所有匹配的,回传一个list

输出:

<re.Match object; span=(78, 84), match='新增1例本土'>
['新增10例境外']

范例2:找出本土和境外的数量,只要数字

# %%
print(re.search("新增(\d+)例本土", text).group(1)) # group(n)表示取出这个表达式中第n个括号的内容
print(re.findall("新增(\d+)例境外", text)) # 有括号时findall会取出所有()内的结果

输出:

1
['10']

范例3:找出文章中所有的台湾县市

print(re.findall("..[县市]", text)) # []内表示都可以

输出:

['居住县', '新北市', '台北市', '基隆市', '桃园市', '彰化县', '新竹县', '台中市', '苗栗县', '宜兰县', '花莲县', '台东县', '云林县', '台南市', '南投县', '高雄市', '屏东县']

注意这边因为居住县市也符合了表达式的内容,因此被抓了出来
在使用re的过程中很常会需要注意和处理是否有包含到了不要的东西或是漏掉必要的东西以进行调整

推荐一个好用的即时检查re的工具——regex101


网页画面

这边可以在底下输入要搜寻的范围,上面输入好你的正规表达式之後就可以即时的透过不同的颜色来快速检查你的正规表达式是否符合需求啦~


<<:  xargs - Linux里好用的工具

>>:  成为工具人应有的工具包-16 ChromeCacheView

Day 5 Tableview小实作2

继续昨天 我们回到新建的tableviewcontroller,写一个变数阵列。 这边是介绍一些比较...

Day 16 ATT&CK for ICS - Persistence(1)

攻击者进入 ICS 工控环境之後,会利用许多手法让自己保持跟 ICS 系统与设备的连线状态,让自己可...

蓝牙小知识

名称的由来 Bluetooth是斯堪地那维亚语言的Blåtand/Blåtann 借10世纪丹麦和...

Day27 - 很像 Vue 的 AlpineJS(二): 常用属性

透过 x-data 宣告一个 Alpine 元件後就可以来操作里面的内容啦!今天会大略介绍一些比较常...

第 10 天 阶段达成继续奋斗( leetcode 003 )

https://leetcode.com/problems/longest-substring-w...