いーほろよいの技術ブログ

IT技術ブログになります。

PHPの正規表現について

お久しぶりです。

漸くMacの修理が完了しました。

修理と言うよりHDDが完全に逝ってしまったのでバラして付け直しです...

ところで、Pythonの続きを書こうかと思っていたのですが、脳みそがお爺ちゃんの私にはどうしてもPHP正規表現をメモしないといけない事情があり別途PHPの内容で更新します。

 

やりたい事

あるタグのある属性(文字列)を正規表現で抜き出したい。

 

こうやる

$str = '<html><head><title>test</title></head><body><form><input type="text" name="name" value="100"></form></body></html>';
$result = preg_replace('/\A(.+)(<input)([^>]+)(name="name")([^>]+)(>)(.+)\z/', '${5}', $str);
print($result);
print("\n");

 

ざっくり書いてあるのである程度はアレンジが必要です。

PHPに限らず使用できると思うので参考になれば幸いです。

 

以上、最後までお読みいただきありがとうございます。

 

お知らせです。

PCが故障しました...しばらくブログを休みます。

 

PythonのClassにチャレンジしてみよう

はじめに

今回からPythonのクラスをやります。

因みに、ここに書かれている事を理解するにはオブジェクト指向が理解できている事を前提としているのですが、Pythonでは完璧なオブジェクト指向のプログラミングは実現できません!

それはドキュメントにも書いてあります。

アクセス権の指定(privateなど)が無いのです。

9. クラス — Python 3.6.1 ドキュメント9.6. プライベート変数を参照)

...ややこしいですね。

私もどう説明していいか分かりません。

正当なルートで勉強するなら"オブジェクト指向Pythonのクラス"だと思います。 

そのため、最初に書いたようにオブジェクト指向が理解できている事が前提としております。 

 

ちょっとだけオブジェクト指向について

先ほどから"オブジェクト指向"と書いていますが、オブジェクト指向概念になります。

そしてクラスはその概念に沿って組み立てる設計図になります。(間違っていたら指摘お願いします。)

 

クラスのアレコレ

クラスをプログラムで記述する時、"class"という予約語があります。

このclassでクラス定義を宣言します。

また、クラスは初期化(initialize)、メンバ変数(プロパティ変数)、メソッドという用語が頻繁に登場します。(下記で簡単な説明します。 )

 

兎に角書いてみる

説明ばかりだと疲れるので、とりあえずプログラムをGitHubにアップしてあるので確認お願いします。

github.com

↓こんなソースになっています。

#
# Sample
#
class Member:
    def __init__(self, name=''):
        """ Initialize the Member class.
        """
        self.name = name

    def get_property(self, value_name):
        """ Get properties of this class.
        """
        return getattr(self, value_name, 'non name')

    def set_property(self, value_name, value):
        """ Set properties of this class.
        """
        setattr(self, value_name, value)

    def bad_arguments(self, value, values=[]):
        """ Bad argument initialization example.
        """
        values.append(value)
        self.bad_values = values

#
# How to handle classes.
# initialize
# getter and setter
member = Member('taro nihon')

# Get "name" property.
print(member.get_property('name'))

# Override "name" property.
member.set_property('name', 'hanako nihon')
print(member.get_property('name'))

# Create "country" property.
member.set_property('country', 'Japan')
print(member.get_property('country'))

# Notes on method arguments.
member.bad_arguments(1)
member.bad_arguments(2)
member.bad_arguments(3)
print(member.bad_values)

 

上記のclass Memberが"Memberクラス"になります。

その中でdefと宣言されている関数がメソッドといいます。

また、"__init__"と名前が付いたメソッドが有りますが、これはクラスを初期化(initialize)する時に呼ばれます。

その中で宣言されているself.nameが"Memberクラスのnameプロパティ変数(メンバ変数)"といいます。

 

実体化(初期化)

クラスはあくまで設計図です。

実際に設計図から実体化するのが、"member = Member('taro nihon')"になります。

この時、ローカル変数memberにMemberクラスが実体化(初期化)され代入されます。

 

すごい中途半端ですが、この辺で今日は終わりたいと思います。

なぜなら疲れたから。

それに新しい事ばかりで理解するのに疲れると思うので。

次回は引き続きサンプルを使用してクラスのメソッドについて説明したいと思います。

 

最後まで読んでいただきありがとうございます。

 

 

Pythonで関数を定義する その3

はじめに

前回の説明でモヤモヤはスッキリしましたでしょうか。

それとも、もっとモヤモヤしましたでしょうか。

あの説明が私の限界なので次に進めます。 

e-horoyoi.hatenablog.com

 今回は任意引数リストのお話です

いくつかの言語を経験されている方でしたら『関数に与える引数を任意に指定したい!』という時があったと思います。(無かった人はあった事にしてください。)

そんな希望を叶えてくれるのが任意引数リストです。

 

任意引数リストって何?

簡単に説明してしまえば引数を任意の数だけ指定できるという事です。

下記のような書き方をします。

def any_args(arg1, *arg2, **arg3):
    print("arg1: ", arg1)
    print("-" * 40)
    for arg in arg2:
        print(arg)
    print("-" * 40)
    for kw in arg3:
        print(kw, ":", arg3[kw])

print("\n===任意引数サンプル===")
any_args("arg1_value",
         "arg2_value1",
         "arg2_value2",
         arg3_1="arg3_value1",
         arg3_2="arg3_value2",
         arg3_3="arg3_value3")

 

 このように可変する引数に対応できる柔軟な書き方が引数名の前に"*"、"**"を指定する事で実現できます。(上記のサンプルでいう*arg2*、*arg3になります。)

GitHubにサンプルプログラムを追記したので実際に動かして確認できます。

github.com

 

関数の定義についてはこの辺で終了したいと思います。

次回はクラスかな...まだ決めてないです。

 

以上、最後までお読みいただきありがとうございます。

Pythonで関数を定義する その2

はじめに

前回は簡単に関数定義について触れました。

今回も注意点なのですが、ドキュメントに書かれていた注意点で意味が『イマイチ分かり難いかな?』と思った点を書いていきたいと思います。

※あくまで個人的に分かり難いと思った箇所です。

 

イマイチ分かり難いドキュメント

こちら"4.7.2. キーワード引数"の"不適切"な使い方についての説明です。

4. その他の制御フローツール — Python 3.6.1 ドキュメント

 その前に下記の用語を理解する必要があります。

位置指定引数 

こちらはドキュメントに説明が無く、いきなり出てくる単語です。

前後の文書を読んでみると、どうやら初期値無しの引数の事を指すようです。

 

キーワード引数

こちらはドキュメントにもあるのですが、kwarg=valueと呼び出す(与える?)事のできる引数です。

 

上記を踏まえてドキュメントの"不適切"な点を確認してみましょう。

def parrot(voltage, state='a stiff', action='voom', type='Norwegian Blue'):
    print("-- This parrot wouldn't", action, end=' ')
    print("if you put", voltage, "volts through it.")
    print("-- Lovely plumage, the", type)
    print("-- It's", state, "!")

parrot() # required argument missing
位置指定引数(voltage)が指定されているのに引数に与えてない

parrot(voltage=5.0, 'dead')  # non-keyword argument after a keyword argument
キーワード引数位置指定引数後でなければならないという原則がある。それを満たしていない。
一見満たしているようだが、第1引数がキーワード引数第2引数が位置指定引数になっている。 parrot(110, voltage=220) # duplicate value for the same argument 位置指定引数の後に続くキーワード引数前の位置指定引数と指定が被っている。
110がvoltageにも関わらず、第2引数のキーワード引数でvoltageが指定されている。 parrot(actor='John Cleese') # unknown keyword argument
存在しないキーワード引数を指定している。

 ざっとこんな感じです。

...余計に混乱させてしまったらゴメンなさい...

ようは下記の形式で呼び出さないといけないという事です。

位置指定引数1{, 位置指定引数n}{, キーワード引数n}

 

以上、最後まで読んでいただきありがとうございます。

Pythonで関数を定義する その1

はじめに

余程小さいプログラムで無い限り関数を定義する事を避けて通れないと思います。

本日はその関数の定義について書いてみたいと思います。

↓公式ドキュメントなので合わせてご確認ください。

4. その他の制御フローツール — Python 3.6.1 ドキュメント

 

関数の定義が必要な場面を考えてみる

例えば名簿にある住所、年齢、氏名を並べて表示するプログラムを組もうとします。

もし、関数定義を使用しないと下記のようなコードになると思います。(ファイルを読み込んでループしないと想定して

print("住所:%s/年齢:%s/氏名:%s" % ('東京', '31', '新宿太郎'))
print("住所:%s/年齢:%s/氏名:%s" % ('神奈川', '25', '神奈川次郎'))
print("住所:%s/年齢:%s/氏名:%s" % ('埼玉', '40', '埼玉三郎'))
... 

この場合、"氏名と年齢を入れ替えたい"となったら全部書き直さないといけません。

...無理です。

こんな規則性がある処理なら、これだけの処理をしてくれる"関数"があってもいいのではないか。

しかし、Pythonにそんなワガママを聞いてくれるやさしい標準関数はございません...

そこで自分で関数を定義する事になります。

 

関数の定義方法

定義自体はそんなに難しく無いのですが、正しく理解して使用しないと取れないバグを生み出してしまいます。

そのため、今回はその辺の注意点を中心に書いていきたいと思います。

 因みに関数定義のフォーマットは下記の通りです。

def  関数名(引数1[, 引数2...]):
  """処理を書く"""

 

 注意点

サンプルプログラムに詳しく記述したのでご参照ください。

github.com

  • 引数を指定できますが、引数を指定した場合は必ず呼び出し時に引数を設定する事になる
  • 引数にデフォルト値を渡す事ができる
  • 関数定義が評価された時点で引数の初期化される
  • 引数のデフォルト値は一度だけ

 

ざっとですがこんな感じです。

 

以上、最後までお読みいただきありがとうございます。

 

Pythonのおしゃれな制御文

はじめに

だいぶハードルを上げてますが、実は大した記事になりません。

本日は制御文のサンプルをGitHubにアップをした、ご連絡とif文とfor文に慣れてきたらよくやる書き方のご紹介です。

下記におしゃれな書き方以外のif文、for文もアップしてあります。

github.com

因みに制御文の公式ドキュメントはこちらです。

4. その他の制御フローツール — Python 3.6.1 ドキュメント

 

if文あるある

『単純なif文なので1行で書きたい!』ですよね〜

では↓のように書きましょう。スッキリです。

num = 10
result = "num = 10" if num == 10 else 'num != 10'
print(result)

 

for文あるある

『リストに空文字列が混じって邪魔だな...』

はい↓で解決です!

data = ['a', '', 'c', 'd', '', 'f', 'g']
data = [x for x in data if x != '']
print(data)

 

所感

特にfor文の空文字列判定して入れ直しする手法は色々なところで使用できるので覚えて置くと便利です。

 

以上、最後までお読みいただきありがとうございます。