1. 程式人生 > >Python學習筆模式匹配與正則表達式之電話號碼和Email地址提取程序

Python學習筆模式匹配與正則表達式之電話號碼和Email地址提取程序

png 模式 -a ner 建議 線圖 直接 bsp 表達式

隨筆記錄方便自己和同路人查閱。

#------------------------------------------------我是可恥的分割線-------------------------------------------

  假設你有一個無聊的任務,要在一篇長的網頁或文章中,找出所有電話號碼和郵件地址。如果手動翻頁,可能需要查找很長時間。

如果有一個程序,可以在剪貼板的文本中查找電話號碼和 E-mail 地址,那你就只要按一下 Ctrl-A 選擇所有文本,按下 Ctrl-C 將它復

制到剪貼板,然後運行你的程序。它會用找到的電話號碼和 E-mail地址,替換掉剪貼板中的文本。當你開始接手一個新項目時,很容

易想要直接開始寫代碼。但更多的時候,最好是後退一步,考慮更大的圖景。我建議先草擬高層次的計劃,弄清楚程序需要做什麽。

  暫時不要思考真正的代碼,稍後再來考慮。現在,先關註大框架。例如,你的電話號碼和 E-mail 地址提取程序需要完成以下任務:

  (1)從剪貼板取得文本。
  (2) 找出文本中所有的電話號碼和 E-mail 地址。
  (3)將它們粘貼到剪貼板。
  (4)現在你可以開始思考,如何用代碼來完成工作。代碼需要做下面的事情:
  (5) 使用 pyperclip 模塊復制和粘貼字符串。
  (6)創建兩個正則表達式,一個匹配電話號碼,另一個匹配 E-mail 地址。
  (7)對兩個正則表達式,找到所有的匹配,而不只是第一次匹配。

  (8) 將匹配的字符串整理好格式,放在一個字符串中,用於粘貼。
  (9)如果文本中沒有找到匹配,顯示某種消息。
  這個列表就像項目的路線圖。在編寫代碼時,可以獨立地關註其中的每一步。每一步都很好管理。它的表達方式讓你知道在 Python

中如何去做。

#------------------------------------------------我是可恥的分割線-------------------------------------------

  示例代碼:

#! python 3
# -*- coding:utf-8 -*-
# Autor: Li Rong Yang
import re,pyperclip
#定義正則表達式,找出文本中所有的電話號碼。
phoneRegex = re.compile(r‘‘‘(
#匹配區號,因為區號可能只是三位數字,也可能是括號中三位數字,所以使用?問號和管道匹配分組中的內容一次或零次
(\d{3}|\(\d{3}\))?
#匹配電話號碼的連接符,因為區號與號碼之間可能是字母也可能是短橫線或者.點符號,所以把他們分在一個組用管道和問號匹配
(\s|-|\.)?
#匹配短橫線後面的三位數字
(\d{3})
#匹配電話號碼的連接符,因為區號與號碼之間可能是字母也可能是短橫線或者.點符號,所以把他們分在一個組用管道和問號匹配
(\s|-|\.)
#匹配四個數字
(\d{4}) 
#匹配分機號
(\s*(ext|x|ext.)\s*(\d{2,5}))?
)‘‘‘, re.VERBOSE)
#定義正則表達式,找出文本中所有的E-mail 地址。
emailRegex = re.compile(r‘‘‘(
#創建自定義字符分類,匹配小寫a到z、大寫A到Z和數字0到9,後面可以有._%+-
[a-zA-Z0-9._%+-]+
#自定義字符分類後面是安特符號
@
#自定義字符分類,匹配寫a到z、大寫A到Z和數字0到9,後面可以有.-
[a-zA-Z0-9.-]+
#匹配分組,.點後面可以是任意大小寫字母,可以有2到4個
(\.[a-zA-Z]{2,4})
)‘‘‘,re.VERBOSE)

#從剪貼板取得文本。
text = str(pyperclip.paste())
#創建一個空列表,將所有的匹配保存在名為 matches 的列表變量中
matches = []
#循環匹配到的電話號碼
for groups in phoneRegex.findall(text):
    #把匹配到的電話號碼,區號、前三位數字、後四位數字轉換為字符串,以斷橫杠分割
    phoneNum = ‘-‘.join([groups[1],groups[3],groups[5]])
    #判斷分機號是否不等於空
    if groups[8] != ‘‘:
        #電話號碼中帶有分機號時,在分機號前面加空格和大寫X
        phoneNum += ‘ X‘+groups[8]
    #把分機號追加到matches列表中
    matches.append(phoneNum)
#循環匹配到的email地址
for groups in emailRegex.findall(text):
    #分組0 匹配整個正則表達式,把email地址追加到matches列表中
    matches.append(groups[0])


if len(matches) > 0:
    # 將匹配的字符串整理好格式,放在一個字符串中,用於粘貼。
    pyperclip.copy(‘\n‘.join(matches))
    print(‘Copied to clipboard:‘)
    # 打印放入粘貼版的內容。
    print(‘\n‘.join(matches))
else:
    # 如果文本中沒有找到匹配,顯示某種消息。
    print(‘No phone numbers or email addresses found.‘)

  運行結果:

技術分享圖片

Python學習筆模式匹配與正則表達式之電話號碼和Email地址提取程序