逆正弦定理を確認してみる

参考ページ:
なりきりランダム論者
matplotlibのチュートリアル
Wikipedia(英語):Arcsine distribution
Wikipedia(英語):Arcsine laws (Wiener process)
Probability Theory(pdf)
式の導出ありlecture note
arcsine laws and interval parititions dirived from a stable subbordinator

コイントスを使った二人ゲームを考える。
AさんとBさんの二人でゲームをして、
表が出たらAさんの勝ち、裏が出たらBさんの勝ちとする。
ひたすら勝負をし続けると、勝敗差はどうなるでしょうか?
試しに100回、1000回、10000回、100000回の勝負をしたときの勝敗差をテストした結果がしたのグラフです。
勝敗差は試合数を増やすほど大きくなるがわかります。
当然ながら勝率は5割に近づくけれども、勝敗差はどんどん広がっていくのがポイントです。

# -*- coding: utf-8 -*-
# 2014/1/2

import numpy as np
import pylab

def cum_rand(num):
a = np.random.random_integers(0,1,num)*2 – 1
return np.cumsum(a) #累積和を取って勝敗差にする

for i in np.arange(10):
pylab.subplot(221)
pylab.plot(cum_rand(100))
pylab.axis([0,100,-1000,1000])
pylab.subplot(222)
pylab.plot(cum_rand(1000))
pylab.axis([0,1000,-1000,1000])
pylab.subplot(223)
pylab.plot(cum_rand(10000))
pylab.axis([0,10000,-1000,1000])
pylab.subplot(224)
pylab.plot(cum_rand(100000))
pylab.axis([0,100000,-1000,1000])
pylab.show()

カテゴリー: 未分類 | コメントをどうぞ

Pythonで使えるメタキャラクタの一覧

Python ライブラリリファレンスより

“.”
(ピリオド) デフォルトのモードでは改行以外の任意の文字にマッチします。 DOTALL フラグが指定されていれば改行も含むすべての文字にマッチします。

“^”
(キャレット) 文字列の先頭とマッチします。MULTILINE モードでは各改行の直 後にマッチします。

“$”
文字列の末尾、あるいは文字列の末尾の改行の直前にマッチします。例えば、 foo は ‘foo’ と ‘foobar’ の両方にマッチします。一方、正規表現 foo$は ‘foo’ だけとマッチします。興味深いことに、 ‘foo1nfoo2n’ を foo.$ で検索し た場合、通常のモードでは ‘foo2′ だけにマッチし、MULTILINE モードでは ‘foo1′ にもマッチします。

“*”
直前にある RE に作用して、 RE を 0 回以上できるだけ多く繰り返したもの にマッチさせるようにします。例えば ab* は ‘a’、’ab’、あるいは ‘a’ に任意個数の’b’ を続けたものにマッチします。

“+”
直前にある RE に作用して、 RE を、1 回以上繰り返したものにマッチさせる ようにします。例えば ab+ は ‘a’ に一つ以上の ‘b’ が続いたも のにマッチし、 ‘a’ 単体にはマッチしません。

“?”
直前にある RE に作用して、 RE を 0 回か 1 回繰り返したものにマッチさせ るようにします。例えば ab? は ‘a’ あるいは ‘ab’ にマッチします。

*?, +?, ??
“*”、”+”、 “?” といった修飾子は、すべて 貪欲 (greedy) マッチ、すなわちできるだけ多くのテキストにマッチす るようになっています。時にはこの動作が望ましくない場合もあります。例え ば正規表現 <.*> を ‘title‘ にマッチさせると、 ‘‘ だけにマッチするのではなく全文字列にマッチしてしまいます。 “?”を修飾子の後に追加すると、非貪欲 (non-greedy) ある いは 最小一致 (minimal) のマッチになり、できるだけ 少ない 文字数のマッチになります。例えば上の式で .*?を使うと ‘‘ だけにマッチします。

{m}
前にある RE の m 回の正確なコピーとマッチすべきであることを指定 します;マッチ回数が少なければ、RE 全体ではマッチしません。例えば、 a{6} は、正確に 6個の “a” 文字とマッチしますが、 5個ではマッチしません。

{m,n}
結果の RE は、前にある RE を、 m回からn 回まで繰り返したもので、 できるだけ多く繰り返したものとマッチするように、マッチします。 例えば、a{3,5}は、3個から 5個の “a” 文字とマッチします。 mを省略するとマッチ回数の下限として0を指定した事になり、 n を省略することは、上限が無限であることを指定します; a{4,}b は aaaabや、千個の “a” 文字に bが 続いたものとマッチしますが、aaabとはマッチしません。 コンマは省略できません、そうでないと修飾子が上で述べた形式と混同されてしまうからです。

{m,n}?
結果の RE は、前にある RE の m回からn 回まで繰り返したもので、できるだけ少なく 繰り返したものとマッチするように、マッチします。これは、前の修飾子の 控え目バージョンです。 例えば、 6文字 文字列 ‘aaaaaa’では、a{3,5} は、5個の “a” 文字とマッチしますが、a{3,5}? は3個の文字と マッチするだけです。

“”
特殊文字をエスケープする( “*”や “?”等のような文字との マッチをできるようにする)か、あるいは、特殊シーケンスの合図です; 特殊シーケンスは後で議論します。

もしパターンを表現するのに raw string を使用していないのであれば、 Python も、バックスラッシュを文字列リテラルでのエスケープシーケンスとして 使っていることを覚えていて下さい;もしエスケープシーケンスを Python の構文解析器が認識して処理しなければ、そのバックスラッシュと それに続く文字は、結果の文字列にそのまま含まれます。しかし、もし Python が 結果のシーケンスを認識するのであれば、バックスラッシュを 2回 繰り返さなければ いけません。このことは複雑で理解しにくいので、 最も簡単な表現以外は、 すべて raw string を使うことをぜひ勧めます。

[]
文字の集合を指定するのに使用します。文字は個々に リストするか、文字の範囲を、2つの文字と”-”でそれらを分離 して指定することができます。特殊文字は集合内では有効ではありません。 例えば、[akm$]は、文字 “a”、”k”、 “m”、あるいは “$”のどれかとマッチします; [a-z] は、任意の小文字と、[a-zA-Z0-9] は、 任意の文字や数字とマッチします。 (以下で定義する) w やSのような 文字クラスも、範囲に含めることができます。もし文字集合に “]” や “-” を含めたいのなら、その前にバックスラッシュを 付けるか、それを最初の文字として指定します。たとえば、パターン []] は ‘]’ とマッチします。

A
文字列の先頭だけにマッチします。

b
空文字列とマッチしますが、単語の先頭か末尾の時だけです。 単語は英数字あるいは下線文字の並んだものとして定義されていますので、単語の末尾は 空白あるいは非英数字、非下線文字によって表されます。 b は、w と Wの間の境界として定義されているので、 英数字であると見なされる文字の正確な集合は、UNICODEとLOCALEフラグの 値に依存することに注意して下さい。 文字の範囲の中では、b は、 Python の文字列リテラルと互換性を持たせるために、 後退(backspace)文字を表します。

B
空文字列とマッチしますが、それが単語の先頭あるいは末尾に ない時だけです。これは bのちょうど反対ですので、 LOCALE とUNICODEの設定にも影響されます。

d
UNICODE フラグが指定されていない場合、 任意の十進数とマッチします;これは集合 [0-9] と同じ意味です。 UNICODE がある場合、Unicode 文字特性データベースで 数字と分類されているものにマッチします。

D
UNICODE フラグが指定されていない場合、 任意の非数字文字とマッチします;これは集合 [^0-9] と 同じ意味です。UNICODE がある場合、これは Unicode 文字 特性データベースで数字とマーク付けされている文字以外にマッチします。

s
LOCALE と UNICODE フラグが 指定されていない場合、任意の空白文字とマッチします;これは 集合 [ tnrfv]と同じ意味です。

LOCALE がある場合、これはこの集合に加えて現在のロケールで 空白と定義されている全てにマッチします。UNICODE が設定されると、 これは [ tnrfv] と Unicode 文字特性データベースで 空白と分類されている全てにマッチします。

S
LOCALE と UNICDOE がフラグが 指定されていない場合、任意の非空白文字とマッチします;これは 集合 [^ tnrfv] と同じ意味です。 LOCALE がある場合、これはこの集合に無い文字と、現在の ロケールで空白と定義されていない文字にマッチします。UNICODE が 設定されていると、[ tnrfv] でない文字と、 Unicode 文字特性データベースで空白とマーク付けされていないものに マッチします。

w
LOCALE とUNICODE フラグが 指定されていない時は、任意の英数文字および下線とマッチします;これは、集合 [a-zA-Z0-9_]と同じ意味です。LOCALEが設定されていると、 集合 [0-9_] プラス 現在のロケール用に英数字として定義されている任意の 文字とマッチします。 もし UNICODE が設定されていれば、 文字 [0-9_] プラス Unicode 文字特性データベースで英数字として分類されて いるものとマッチします。

W
LOCALEと UNICODE フラグが 指定されていない時、任意の非英数文字とマッチします;これは 集合 [^a-zA-Z0-9_]と同じ意味です。 LOCALEが指定されていると、 集合 [0-9_]になく、 現在のロケールで英数字として定義されていない任意の文字とマッチします。 もし UNICODEがセットされていれば、これは [0-9_] および Unicode 文字特性データベースで 英数字として表されている文字以外のものとマッチします。

Z
文字列の末尾とのみマッチします。

範囲内にない文字とは、その集合の補集合をとることで マッチすることができます。これは、集合の最初の文字として “^” を含めることで表すことができます; 他の場所にある “^”は、単純に “^”文字とマッチするだけです。例えば、 [^5] は、 “5″以外の任意の文字とマッチし、 [^^] は、 “^” 以外の任意の文字とマッチします。

“|”
A|B は、ここで A と B は任意の RE ですが、 A か B のどちらかとマッチする正規表現を作成します。任意個数の RE を、 こういう風に “|” で分離することができます。これはグループ (以下参照) 内部でも同様に使えます。検査対象文字列をスキャンする中で、 “|” で分離された RE は左から右への順に検査されます。 一つでも完全にマッチしたパターンがあれば、そのパターン枝が受理されます。 このことは、もし A がマッチすれば、たとえB によるマッチが 全体としてより長いマッチになったとしても、B を決して検査しないことを 意味します。 言いかえると、”|” 演算子は決して貪欲 (greedy) ではありません。 文字通りの “|”とマッチするには、| を使うか、 あるいはそれを [|] のように文字クラス内に入れます。

カテゴリー: 未分類 | コメントをどうぞ

文字エンコードについて

文字エンコードが何のことかよくわからいので調べた。
以下Adobeのサイトより引用です。

文字エンコードについて

文字エンコードとは、文字セットに含まれている個々の文字と、コンピュータで表現可能な数値との間のマッピングのことです。 これらの数値はシングルバイトまたはマルチバイトで表すことができます。 たとえば、ASCII エンコードでは、7 ビットを使用してラテンアルファベット、句読点、および制御文字を表します。

日本語のテキストを表すには、Shift-JIS、EUC-JP、ISO-2022-JP などの日本語エンコードを使用します。 これらのエンコードはわずかに異なりますが、いずれの文字セットにも、日本語で使用される約 10,000 個の文字を含む一般的な文字セットが含まれています。

文字エンコードでは、次の用語が使用されます。

SBCS : シングルバイト文字セット。ASCII または ISO 8859-1 などの、1 文字につき 1 バイトでエンコードされる文字セットです。

DBCS : ダブルバイト文字セット。Shift-JIS などの、文字セットを 2 バイト以下でエンコードする方法です。 Shift-JIS などの、2 バイト文字エンコードスキームの多くには、1 バイトでエンコードされる文字と 2 バイトでエンコードされる文字が混在します。一方、UCS-2 などはすべての文字で 2 バイトを使用します。

MBCS : マルチバイト文字セット。文字によって異なる長さのバイト列でエンコードされる文字セットです。UTF-8 などがこれに該当します。

一般的な文字エンコード
ASCII (SBCS) :
英語およびインドネシア語で使用される 7 ビットエンコード。
Latin-1 (SBCS) :
多くの西ヨーロッパ言語で使用される 8 ビットエンコード。
Shift_JIS (DBCS) :
16 ビットの日本語エンコード。
UTF-8 (MBCS) :
マルチバイトの Unicode エンコード。 ほとんどのアジア言語の文字は 3 バイトです。ASCII は 7 ビット、ヨーロッパおよび多くの中東言語で使用される非 ASCII 文字は 2 バイト。

テスト:

len(u’あ’.encode(‘UTF-8′))
Out[152]: 3 (バイト)

関数lenは上のようにunicode型にエンコードすると、バイト数を返してくれます。
‘あ’をUTF-8でエンコードすると、3バイトであることがわかります。

len(u’あ’.encode(‘sjis’))
Out[153]: 2(バイト)

‘あ’をShift_JISでエンコードすると、2バイト(16bit)になっています。

それぞれのエンコードされた結果は

u’あ’.encode(‘UTF-8′)
Out[165]: ‘xe3x81x82′

u’あ’.encode(‘sjis’)
Out[166]: ‘x82xa0′

となっており、確かにUTF-8は3バイト、Shift_JISは2バイトになっています。

<追加>
IT用語辞典より追加
文字コード:
文字や記号をコンピュータで扱うために、文字や記号一つ一つに割り当てられた固有の数字のこと。

欧米などで使われる英数字の文字コードは1バイトで表現されるが、これでは256文字しか表現できず、日本語の漢字などは収録できないため、日本や韓国、中国などではそれぞれ独自に2バイト(最大65536文字)のコード体系を定め、それぞれ自国内で使用している。

1バイトの文字コードとしてはASCIIが世界標準となっているが、一部の大型コンピュータではIBM社のEBCDICを使うものもある。

日本語の文字コードは、JIS(日本工業規格)で標準化されたJISコードの他、主にUNIXなどで使われるEUC、WindowsやMac OSなどで使われるシフトJISの3種類が利用されている。

最近では、世界のほとんどの主要な言語をサポートした2バイトの統一文字コード体系であるUnicodeの規格化が進み、一部で利用が始まっている。

Unicodeはこれまで各国でばらばらに制定されてきた文字コードを統一するものとして期待されているが、普段アルファベットしか使わない欧米の情報技術関連企業を中心に規格化が進んだこともあり、数多くの文字を抱えるアジアの国々からは批判されている。

Unicode:
Apple社、IBM社、Microsoft社など米国の情報関連企業が中心となって提唱し、1993年に国際標準化機構(ISO)でISO/IEC 10646の一部(UCS-2)として標準化された文字コード体系。

すべての文字を16ビット(2バイト)で表現し、1つの文字コード体系で多国語処理を可能にしようとするもの。世界の主要な言語のほとんどの文字を収録している。

2バイト表記では最大65536文字しか収録できないため、中国語・日本語・韓国語で同じ意味や同じルーツの漢字はすべて同じ文字とみなし、同じコードを割り当てる統合作業(ハンユニフィケーションと呼ばれる)が行われ、文化の違いを無視したものだとの反発を招いている。

Unicodeは、最初の規格が策定された後にハングル文字の追加や異体字表現方式の策定が行われ、部分的に3バイト以上を使用する体系に変化している。このため、現在はUnicode全体は4バイトで定義(UCS-4)されている。

UCS 【 Universal multi-octet coded Character Set 】:
ISO/IECによって策定された、符号化された文字集合の国際標準。1993年5年に最初の規格が発行され、現在も改訂、文字の追加がつづいている。世界の主要な言語で使われる文字のほとんどを収録する。31ビット(4バイト)のUCS-4と、その部分集合である16ビット(2バイト)のUCS-2がある。符号化方式としてUTF(UCS Transformation Format)が規定されており、現在よく用いられるのはUTF-8である。

UTF-8:
UCS-2やUCS-4(Unicode)で定義される文字集合を用いて記述された文字列をバイト列(数値の列)に変換する方式の一つ。UTF-8では1文字を1~6バイトの可変長の数値(バイト列)に変換するようになっているが、現在定義されているUnicode文字をUTF-8で表現した場合、最長で4バイトのバイト列に変換される。

UTF-8では、Unicodeの最初の128文字(UCS-2でいうU+0000からU+007F)を変換した結果がASCIIとまったく同じになるため、従来の処理システムとの親和性が高いという特長がある。一方、日本語などの文字は元々2バイトだったものが3バイトや4バイトで表現されてしまうため、UTF-16と比べてデータサイズが大きくなってしまうという欠点がある。

ちなみに、UTF-16ではUCS-4を完全に表現することはできないが、理論上はUTF-8はUCS-4を完全に表現できる。

カテゴリー: 未分類 | コメントをどうぞ

Pythonの正規表現で日本語を扱う

Python2.X系の正規表現で日本語や全角を扱う方法

・パターンと検索対象の文字列をunicodeに変換
・serchやmatchを使う際にunicodeフラグを指定
・-*- coding: utf-8 -*- をファイル先頭に記述
(UTF-8からユニコード(UCS-2)にエンコードさせるため)

テストしてみる
‘.’(ピリオド)はメタキャラクタで、任意の1文字を表す。改行を除く全角,半角,空白文字である。
re.subはマッチした場所を置き換える処理をする。

print re.sub(u’あ.す’, u’-マッチ-’, u’あいす’, re.U)
-マッチ-
print re.sub(u’あ.す’, u’-マッチ-’, u’あらす’, re.U)
-マッチ-

print re.sub(u’あ.す’, u’-マッチ-’, u’あいつ’, re.U)
あいつ
print re.sub(u’あ.す’, u’-マッチ-’, u’あすぱらがす’, re.U)
あすぱらがす

‘あ.す’に対して’あいす’と’あらす’はマッチするが、’あいつ’と’あすぱらがす’はマッチしていない。

参考にさせて頂いたページ:
taichino.com
日記

カテゴリー: 未分類 | コメントをどうぞ

Python 正規表現の参考リンク

サルにもわかる正規表現入門
確かにわかりやすい。これくらいわかりやすくしてもらえるとありがたい。例がわかりやすい。

Python正規表現ゼミ
正規表現についてわかりやすく説明。ゼミの資料のようだ。

Python2.7公式 正規表現 HOWTO
公式のHOW TO

Pythonの正規表現モジュールreの公式ドキュメント
公式

お気楽 Python プログラミング入門 第 4 回 正規表現とジェネレータ
とてもよくまとまっていてわかりやすい

Dive into python 3
ローマ数字判定や郵便番号のパースなど具体例で解説してあるのが分かりやすい。

[Ruby Python]正規表現に関しておさらい
具体例豊富にまとめてくれている

googleのPythonの授業?
正規表現の問題などいくつか用意されている。

マイクロソフトデベロッパーネットワーク
Python限定ではないが、特殊文字の一覧が表になっていてわかりやすい

すぐ使える!正規表現サンプル集
最低限のことがわかりやすく書いてある。日本語対象でなじみやすい。問題などもあり。

minus9dの日記
Pyhonの正規表現HOW TOの簡単なまとめ

ひきメモ
[python]正規表現 – コンパイル時のフラグ、名前付きのグループ化、文字列の分割・置換

Python入門
正規表現の解説

Pythonで正規表現による文字列処理(検索・置換・分割)を行う – 試験運用中なLinux備忘録
日本語とwebアドレスなど置換と分割

住所文字列の分解
PHPだけど参考になる

カテゴリー: コラム | コメントをどうぞ

正規表現って何?

正規表現とは?

書物やいくつかのサイトから引用:

「特定の文字列そのものを完全に表現するのではなく、ある条件を満たす文字列を表現するための標準的な記法」
SoftwareDesign2013May 誰にでも役立つ正規表現

「正規表現(せいきひょうげん、regular expression)とは、文字列の集合を一つの文字列で表現する方法の一つ」
wikipedia

「正規表現とは、文字列内で文字の組み合わせを照合するために用いられるパターン」
MDN

以下wikipediaより抜粋

もともと正規表現は形式言語理論において正規言語を表すための手段として導入された。

その後正規表現はテキストエディタ、ワードプロセッサをはじめとするアプリケーションソフトでパターンマッチ文字列を表すために使用されるようになり、表せるパターンの種類を増やすために本来の正規表現にはないさまざまな記法が新たに付け加えられた。

このような拡張された正規表現には正規言語ではない文字列も表せるものも多く、ゆえに正規表現という名前は実態に即していない面もあるが、伝統的に正規表現と呼ばれ続けている。

ほとんどのプログラミング言語では、構文またはライブラリによって正規表現を使うことができるようになっている。構文やライブラリに正規表現を備えたプログラミング言語やユーティリティとして、AWK、Sed、Perl、Python、Ruby、Java、JavaScript、PHPなどがある。

⇒要するにソフトやプログラミングにおいて正規表現を用いた文字列のパターンマッチを行う機能のことを、単に正規表現ということが多い。

正規表現で何ができる?

MSDNより引用
一般的な検索処理と置換処理では、文字列を正確に指定する必要があります。静的テキストを対象とする単純検索や置換作業には十分かもしれませんが、動的テキストでは柔軟性に欠け、検索が困難になる場合もあります。

正規表現を使用すると、次のことが可能になります。

  • 文字列内のパターンのテスト。たとえば、入力文字列をテストして、文字列内に電話番号またはクレジットカード番号のパターンがあるかどうかをチェックできます。これをデータ確認と呼びます。
  • 文字列の置換。正規表現を使用して、ドキュメント内にある文字列を特定し、削除したり、ほかの文字列と置換できます。
  • パターン マッチに基づく、文字列からのサブ文字列の抽出。ドキュメントまたは入力フィールド内の特定の文字列を検索できます。

たとえば、Web サイト全体を検索して、日付の古いものを削除したり、HTML タグを置換したりする必要がある場合に、削除対象のものや置換対象の HTML タグがファイルに存在するかどうかを正規表現を使用して確認できます。削除対象または置換対象のものだけが含まれるファイルを絞り込むことができます。このようにして、正規表現を使用して日付の古いものを削除し、置換対象のタグを検索して置換できます。

よくつかわれる用語

パターン:
正規表現によって表わされる文字列。正規表現パターンともいう.

文字:
正規表現においては全角文字,半角文字,記号,空白文字を指す(改行は除く)

メタキャラクタ(メタ文字):
パターンに用いられる”.”や”[ ]“などの特殊な文字

特殊シーケンス:
dやwなどの数字,小文字・大文字などを表す特殊な意味を持つ文字のこと。

マッチ:
ある文字列と正規表現パターンが一致すること。

メタキャラクタ(メタ文字)の例

文字列のパターンを表現するために正規表現は、”メタキャラクタ” という特殊文字を使います。メタキャラクタには例えば”.”(ピリオド)があります。”.”(ピリオド)は任意の一文字を表すメタキャラクタです。例えば

‘a.b’というパターンであれば
マッチするのは
‘aab’, ‘acb’, ‘a9b’などの文字列で、
マッチしないのは
‘aaab’, ‘bab’, ‘aac’などの文字列です。

str_list = (‘aab’, ‘acb’, ‘a9b’, ‘aa45b’, ‘bab’, ‘aac’)
for s in str_list:
print s
print re.sub(‘a.b’, ‘-MATCHED-’, s)
<結果>
aab
-MATCHED-
acb
-MATCHED-
a9b
-MATCHED-
aa45b
aa45b
bab
bab
aac
aac

カテゴリー: コラム | コメントをどうぞ