毎日ちょっとPython ~ 21日目 ~
連休中、ちょっといろいろ休もうと思って休みました。という事でまた再開します。
前回の結果はこんな感じ。
クリップボードにコピーしました:
800-420-7240
415-863-9900
415-863-9950
o@nostarch.com
a@nostarch.com
c@nostarch.com
o@nostarch.com
という感じでなんというかうまくとれなかった。
実行しているコードはこんな感じ
#! python3
# phoneAndEmail.py - クリップボードから電話番号とメアドを検索する
import pyperclip, re
phone_regex = re.compile(r'''(
(\d{3}|\(\d{3}\))? #市外局番
(\s|-|\.)? #区切り
(\d{3}) #3桁の番号
(\s|-|\.) #区切り
(\d{4}) #4桁の番号
(\s*(ext|x|ext.)\s*(\d{2,5}))? #内線番号
)''',re.VERBOSE)
#TODO: 電子メールの正規表現
email_regex = re.compile(r'''(
[a-zA-Z0-9._%+-] #ユーザ名
@ #@記号
[a-zA-Z0-9.-]+ #ドメイン名
(\.[a-zA-Z]{2,4}) #ドット何とか
)''',re.VERBOSE)
#TODO: クリップボードのテキストを検索する
text = str(pyperclip.paste())
matches = []
for groups in phone_regex.findall(text):
phone_num = '-'.join([groups[1],groups[3],groups[5]])
if groups[8] != '':
phone_num += ' x' + groups[8]
matches.append(phone_num)
for groups in email_regex.findall(text):
matches.append(groups[0])
#TODO: 検索結果をクリップボードに貼り付ける
if len(matches) > 0:
pyperclip.copy('\n'.join(matches))
print('クリップボードにコピーしました:')
print('\n'.join(matches))
else:
print('電話番号やメールアドレスは見つかりませんでした')
で気がつきました。電子メールの正規表現で+が抜けてますね。ちょっとなおしてみました。これでもう一回実行してみる。
800-420-7240
415-863-9900
415-863-9950
info@nostarch.com
media@nostarch.com
academic@nostarch.com
info@nostarch.com
今度はうまくいきました。類似のプログラムのアイデアとして、
- https:// で始まるWebサイトのURLを検索する。
- 様々な日付フォーマット(7/27/2020 , 07-27-2020 , 2020/07/27)を整形して一つのフォーマットに置き換える
- マイナンバーやクレジット番号など、センシティブ情報を削除する。
- よくある誤記を見つける。(スペース複数とか)
なんか演習プログラムを作るらしい。引数をうけとって強いパスワードの検出するかいなかみたいなかんじですかね?大文字小文字、一つ以上の数字を含むものとする。
[a-zA-Z0-9]{8,}
みたいな感じで行けるかしら?さぁ正規表現編が終了。
ファイルの読み書き
変数はプログラムの実行中にデータを保持しておくには便利な手段ですが、プログラムの終了後にもデータを保持しておきたいときには、ファイルに保存する必要があります。
ファイルには、ファイル名とパスの二つの重要な構成要素があります。
- ファイルパス名 -> C:Users/ユーザー名/document/
- ファイル名 -> projects.docx
みたいな感じ。
windows はフォルダ名の間をバックスラッシュ(\)を区切ってパスを書く。MacとLinuxでは区切り文字としてスラッシュ(/)を用います。すべてのOSで動作するプログラムを書こうと思ったら、両方に対応するにように書く必要があります。
便利なことに、os.path.join()という関数を用いれば簡単に実現できます。(こんなに便利なのPythonって。すごい。)
os.path.join()は、パスを構成するフォルダ名t路ファイル名を渡せばOSに依存する区切り文字でつないだ正しいパスを文字列として返します。
>>> import os
>>> os.path.join('usr','bin','spam')
'usr\\bin\\spam'
筆者はファイル操作関数に渡して用いるようなスクリプトをというところでお時間です。
おわり