Python Phone And Email Address Extractor

# !/user/bin/env python
# - Finds phone numbers and email address on the clipboard
# クリップボードから、電話番号とメールアドレスを見つける。

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)

# Create email regex
emailRegex = re.compile(r'''(
                    [a-zA-Z0-9._%+-]+
                    @
                    [a-zA-Z0-9.-]+
                    (\.[a-zA-Z]{2,4})
                    )''', re.VERBOSE)



def main():

    #Find matces in clipboard text
    text = str(pyperclip.paste())
    matches = []
    for groups in phoneRegex.findall(text):
        phoneNum = '-'.join([groups[1], groups[3], groups[5]]) # グループの関係がややこしい
        if groups[8] != '':
            phoneNum += ' x' + groups[8]
        matches.append(phoneNum)

    for groups in emailRegex.findall(text):
        matches.append(groups[0])


    # Copy results to clipboard.

    if len(matches) > 1:
        pyperclip.copy('\r\n'.join(matches))
        print('Copied to clipboard:')
        print('\r\n'.join(matches)) # \r\nは、windowsの仕様?
    else:
        print('No phone numbers or email address found.')

if __name__ == '__main__':
    main()

 

 

電話番号の形式とメールの形式の文字列を抜き出す。

例:

https://www.nostarch.com/contactus.htm

をctrl + A でコピーしてスクリプトを実行!

すると

電話番号とメールアドレスがクリップボードにコピーされている。

 

詳しい正規表現については、

http://docs.python.jp/3.6/library/re.html

を参照!

 

Python Star Adder

学習の記録

# !/user/bin/env python
# No Starch Automate the Boring Stuff with Python より
# クリップボードの記録されている文字列の先頭に'★'をつける。

import pyperclip


def main():
    text = pyperclip.paste()

    # 行ごとに文字列を分けて先頭に*をつける。
    lines = text.split('\r\n')  # \r\n 改行コード
    for i in range(len(lines)):
        lines[i] = '★' + lines[i]  # スターを文字列の先頭に追加

    # リストを結合
    text = '\r\n'.join(lines)
    # クリップボードにコピーする。
    pyperclip.copy(text)


if __name__ == '__main__':
    main()

使い方

例えば、

apple
bag
pen

をコピーする。

スクリプトを実行すると、

★apple
★bag
★pen

とクリップボードにコピーされる。

箇条書きのようにすることができる。

Python Password Locker

学んだ記録

# !/user/bin/env python
# No Starch Automate the Boring Stuff with Python より
# pw.py  -  An insecure password locker program
import sys, pyperclip

PASSWORDS = {'email': 'F7minlBDDuvMJuxESSKHFhTxFtjVB6',
             'blog': 'VmALvQyKAxiVH5G8v01if1MLZF3sdt',
             'luggage': '12345',
             }


def main():
    if len(sys.argv) < 2:  # 入力された文字列が二つより少ないなら表示
        print('Usage: Python pw.py [account] - copy account password')
        sys.exit()

    account = sys.argv[1]  # 入力された文字をaccountに保存
    if account in PASSWORDS:
        # 入力された文字列に対応したパスワードを自分のパソコンのクリップボードにコピー
        pyperclip.copy(PASSWORDS[account])
        print('password for ' + account + ' copied to clipborad.')
    else:
        print('There is no account named ' + account)


if __name__ == '__main__':
    main()

例えば、使い方としてコマンドプロンプトで、

$ python pw.py email

と入力。

password for email copied to clipborad

と表示されてクリップボードに、’F7minlBDDuvMJuxESSKHFhTxFtjVB6′

がコピーされる。

これでコピペすることができる。

Python 正規表現

自分の他のブログから持ってきた。

正規表現を使えると文章の中から検索もできるし、変えたい文字があるとき、それが複数あってもまとめて変えられるので便利。

 

・正規表現を使用して見つかったパターンをマッチすると言う。

# !/user/bin/env python



import re  #importする。





def main():



    pattern = r'a'  # 見つけたい文字。 ''の前にrをつけることで「」をそのまま使える。

    text = 'abcda'



    m = re.match(pattern, text)  # re.match(見つけたい文字, 検索する文字列)

                                 # 文字列の先頭で正規表現とマッチの判定



    n = re.search(pattern, text)  # re.search(見つけたい文字, 検索する文字列)

                                  # 見つけたい文字がどこかにあれば返す



    l = re.findall(pattern, text)  # re.findall(見つけたい文字, 検索する文字列)

                                   # マッチした部分文字列をすべて探し、リストで返す。   



    print(m)  # <_sre.SRE_Match object; span=(0, 1), match='a'>

    print(n)  # <_sre.SRE_Match object; span=(0, 1), match='a'>

    print(l)  # ['a', 'a']



    # search()関数 ※マッチが複数あっても最初の箇所だけ返す。



    print(n.group())  # a  マッチした文字列を返す

    print(n.start())  # 0  マッチの開始位置

    print(n.end())    # 1  マッチの終了位置

    print(n.span())   # (0, 1)  マッチの位置





if __name__ == '__main__':

    main()

Python if文 or分岐がたくさんある場合

if文で分岐するときにorの条件が多いとソースコードが見づらくなる。

そのため、以下のように書くと文字が少なくなり、楽になる。

# !/user/bin/env python
def main():
    list = [i for i in range(10)]
    print(list)  # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

    for i in list:
        if i == 1:
            print('a:{}'.format(i))
        elif i == 2:
            print('a:{}'.format(i))
        elif i == 3:
            print('a:{}'.format(i))
        else:
            print(i)

    """
    0
    a:1
    a:2
    a:3
    4
    5
    6
    7
    8
    9
    """

    for i in list:
        if i in {1, 2, 3}:
            print('a:{}'.format(i))
        else:
            print(i)
    """
    0
    a:1
    a:2
    a:3
    4
    5
    6
    7
    8
    9
    """
if __name__ == '__main__':
    main()

あまり使う機会はないかもしれないけど、便利であると思う。

追記

switch文がないのは、あきらめるしかない。

ifとelifを使うしかない・・・

ダックタイピングを上手く使えばきれいになるのかな。

2022/11追記

いまだと、match文があるからこれを使うのが良いかも

https://qiita.com/ksato9700/items/3ce4c68c0d713874b693

Python OrderdDict

OrderdDict

 

# !/user/bin/env python

from collections import OrderedDict


def main():
    dict = OrderedDict()

    dict[1] = 'a'
    dict[2] = 'b'
    dict[3] = 'c'

    print(dict)  # OrderedDict([(1, 'a'), (2, 'b'), (3, 'c')])


if __name__ == '__main__':
    main()

普通のdictと違って要素を追加した順番を記憶している。

lambda式を使って、ソートの仕方を変えることもできる。

リストと同じように、順番を覚えてくれるのは便利だと思う。

 

http://docs.python.jp/3.5/library/collections.html

http://shannon-lab.org/?p=1743

 

 

Pycharm ショートカット

Pycharmのショートカットについて

 

ショートカットの一覧の場所

File → Setting → keymap

 

よく使っているショートカット

・設定を開く Shift + Alt + s

・新しいファイル、ディレクトリなど新規作成 Alt + Insert

・スクリプトを選んで実行 Shift + Alt + F10

・現在のスプリクトを実行 Alt + F10

・リネーム Shit + F6

ファイルを選択して使うと、ファイルの名前の変更。

ソースコードで使うとその名前と同じ部分をまとめて変更。

・コードを選択して、Ctrl + / でコメントアウトできる。

 

この他にも便利なショートカットがあるので使っていきたい。

 

import先と同じ名前のファイル名にした エラー

うっかり間違いをした。

ファイル名をnumpy.pyとして、inport numpy as np

をした。

そうしたら、

AttributeError: module ‘numpy’ has no attribute ‘array’

となった。

当たり前のことだけど、自分自身をimport したことになるので、アトリビュートエラーになる。また、同じディレクトリにnumpy.pyがあるとこのエラーになる。

どうしてエラーになったのか悩んだので記録に残しておく。

プログラミングでかじったこと

Python

・Pythonチュートリアル、入門Python3、その他オライリー本

・Webスクレイピング

・Linux

・伝熱方程式

・text編集

・科学計算

・ディープラーニング

・Paiza

・簡単なゲーム

 

 

Java

・入門書

Scala

・入門書

Ruby

・入門書

 

プログラミング全般

「プログラムはこうして作られる」

 

大体Pythonがメイン。自分にとっては、ほかの言語よりもわかりやすくて楽しい。Javaもほんの少し浅瀬でバシャバシャしたくらいだけど、オブジェクトのこととか、ガーベージコレクションのこととか分かって良かった。

最初に、「プログラムはこうして作られる」の本に出合えたのは大きいかも。HelloWorld以前のぷプログラミングの考え方について教えてくれたのでほとんどプログラムについて触ったことのない自分にとってはためになった。

分からないことは、Yahoo知恵袋と個人ブログ、Qiitaで大体は知ることができた。根本的なことは、オライリーの本やリファレンスを参考にしていった。すごく便利でした。ありがとうございます。

独学でしかやってないので、これからどうやっていくかは模索中。独学だからこそ、いろいろなサイトに行ったり、ネット上でブログを書いている人から教えてもらったりして行くのが大事かなと思う。

Pythonについてはラズベリーパイもいじってみたい。買ってみようかなー!

Python 選択ソート(単純比較法)

[-1, 1, 3, 4, 9, 6, 2]

# !/user/bin/env python


def main():
    list = [1, 3, 4, 9, 6, 2, -1]

    for i in range(len(list) - 1):
        
        min = list[i]
        k = i
        for j in range((i+1), len(list)):
            if min > list[j]:
                min = list[j]

                k = j

        tmp = list[i]
        list[i] = list[k]
        list[k] = tmp

    print(list)


if __name__ == '__main__':
    main()

ソート前 : [1, 3, 4, 9, 6, 2, -1]

ソート後 : [-1, 1, 2, 3, 4, 6, 9]

 

[1, 3, 4, 9, 6, 2, -1]から最小値を選んで先頭から並べていく。

最小値を’ ‘で囲ってます。

[1, 3, 4, 9, 6, 2, ‘-1’] → [‘-1’, 1, 3, 4, 9, 6, 2]

[-1, ‘1’, 3, 4, 9, 6, 2] → [-1, ‘1’, 3, 4, 9, 6, 2]

[-1, 1, 3, 4, 9, 6, ‘2’] → [-1, 1, ‘2’, 3, 4, 9, 6]

[-1, 1, 2, 3, 4, 6, 9]

 

デメリットとして処理速度が遅いです。バブルソートよりは、すこし早いです。