Help:Pywikipediabot/正規表現
多数の変更を一括で行いたいとき、正規表現はとても便利です。ここではそのほんの一部の機能を説明します。
準備
[編集]まず、テキストエディタを準備しましょう。正規表現に対応しているものを選ぶ必要があります[1]。
メタ文字
[編集]正規表現には特別な意味を持つ文字がいくつかあります。これをメタ文字といいますが、次の文字群がそれの一部です。
_ \ $ ^ ( ) [ ] ? * + { }
文字 | 説明 |
---|---|
. | なんでもよいから1文字という意味です。'1'にも、'A'にも、'あ'にも一致します。 |
\ | \s(空白)や\n(改行)のように使って一つの意味を持ちます。\にはもう一つ意味がありますが、それは後にします。 |
$ | 文字列の終わりということを示します。 |
^ | 文字列の先頭を表します。 |
() | 文字列をグループ化します。ここでグループ化したものは、後で\1、\2という形で参照できます。 |
[] | その場所にくる文字を指定します。^で否定に転じます。 |
? | 前に文字が1個ないし0個あることを示します。 |
* | 前に文字が0個以上あることを示します。 |
+ | 前に文字が1個以上あることを示します |
{} | 前の文字がいくつあるかを指定します。 |
\
[編集]$を文字列の終端という意味ではなく、アメリカの通貨として扱いたいときがあるでしょう。こういうときメタ文字は少し不便です。
$を本来の意味で取りたいときには$の前に\をつけて「\$」というようにします。他のメタ文字も同様です。\自身を参照したいときは「\\」とします。
検索する
[編集]まず初めにテキストエディタへ
ウィキペディアはウィキメディア財団のプロジェクトの一つで多くのウィキペディアンたちによって運営されているウィキ
と打ち込んでください。
.
[編集]. と打って検索してみましょう。
ウィキペディアはウィキメディア財団のプロジェクトの一つで多くのウィキペディアンたちによって運営されているウィキ
すべての文字にマッチします。.は任意の1文字にマッチする、つまりそれ単体で使用した場合すべての文字と合致します。
?
[編集]?は前に文字が1個ないし0個あることを示します。
「ウィキペディアン?」と検索してみましょう。
ウィキペディアはウィキメディア財団のプロジェクトの一つで多くのウィキペディアンたちによって運営されているウィキ
この?は前の文字が0個ないし1個あることを示します。つまり、「ウィキペディア」と「ウィキペディアン」の両方がマッチするわけです。
*
[編集]前に文字が0個以上あることを示します。なお、windowsのコマンドプロンプトでのファイル名操作などに使うワイルドカードとは別の物なので、注意してください。
「ウィキペディアン*」でもこの文字列であれば同じ結果が得られますが、*の場合「ウィキペディアンンンンン」という文字列にもマッチします。
+
[編集]前に文字が1個以上あることを示します。
「ウィキペディアン+」は、「ウィキペディアン」にはマッチしますが、「ウィキペディア」にはマッチしません。
.と+、?を組み合わせる
[編集].は任意の一文字、+は1文字以上あることを示します。さて組み合わせて「.+」とするとどうなるでしょう。これは「なんでもいいから文字が1つ以上ある」ということを表します。同様に、「.?」は「なんでもいいから文字が0個か1個ある」という事を示します。
ここで「ウィキ」で始まり「ア」で終わる単語(ウィキペディア・ウィキメディア)を検索してみましょう。上を見る限り、この場合は「ウィキ.+ア」と打てば検索できるはずです。
さて、どうなったでしょうか。おそらく、
「ウィキ.+ア」の検索結果:
ウィキペディアはウィキメディア財団のプロジェクトの一つで多くのウィキペディアンたちによって運営されているウィキ
のようにマッチしたでしょう。これは+が1文字<以上なら何文字でも合致するからです[2]。
[と]
[編集]さて、上のような文字列では「ウィキメディア」や「ウィキペディア」は検索できないことがわかりました。ではどうするのか。
よく見るとウィキメディアとウィキペディアは「ペ」が「メ」に変わっただけの物のようです。こういった場合が[]の出番です。
[と]は[あいう]のように使います。これは「あ」か「い」か「う」の内どれか一つであるという事を示します。つまり、「ウィキ[ペメ]ディア」とすれば先ほどの物は検索できます。っまた、[A-z]のように指定することもできます。[あ-う]ももちろん有効ですが、これはJISコード順になっているということに注意してください[3]。
「ウィキ[ペメ]ディア」の検索結果:
ウィキペディアはウィキメディア財団のプロジェクトの一つで多くのウィキペディアンたちによって運営されているウィキ
[]と*や+を組み合わせることもできます。[]と*を組み合わせると[]内の文字が0個以上あるという意味、つまり[あいう]*とすれば、「あいあ」や「い いい」「あいうういあ」などの文字列がマッチします。また、[]と+を組み合わせれば[]内の文字が1個以上あるという意味、つまり「あいうう」や「うい あいあ」などの文字列がマッチします。
否定
[編集][^あいう]のようにすることで、「あ」「い」「う」以外の文字を指定することができます。
「ウィキペディア[^ン]」とすれば「ウィキペディアン」は検索されないということです[4]。
^ と $
[編集]これらはそれぞれ文字列の先頭と終端を意味します。
例えば「^ウィキ」とすれば最初のウィキ(ペディア)だけがマッチしますし、「ウィキ$」とすれば最後のウィキだけがマッチします。
「^ウィキ」の検索結果:
ウィキペディアはウィキメディア財団のプロジェクトの一つで多くのウィキペディアンたちによって運営されているウィキ
「ウィキ$」の検索結果:
ウィキペディアはウィキメディア財団のプロジェクトの一つで多くのウィキペディアンたちによって運営されているウィキ
( と )
[編集]()はグループ化という意味を持ちます。文字列は|で区切ってください。「私は(東京都|日本)出身です。」のように使用します。これは「私は東京都出身です。」という文と「私は日本出身です。」という文にマッチします。
「私は(東京都|日本)出身です。」の検索結果:
- 私は東京都出身です。
- 私はアメリカ出身です。
- 私は日本出身です。
長い文章も指定できますが、あまり長いと正規表現の恩恵を感じられないかもしれません。また、テキストエディタによっては制限があるかもしれません。
{ と }
[編集]{ と }は{n,m}もしくは{n}の形(n、mは数)で使用し、前の文字がいくつあるかを指定します。
「ウィキペディアン{2,3}」の検索結果:
- ウィキペディア
- ウィキペディアン
- ウィキペディアンン
- ウィキペディアンンン
- ウィキペディアンンンン
「ウィキペディアン{2}」の検索結果:
- ウィキペディア
- ウィキペディアン
- ウィキペディアンン
- ウィキペディアンンン
{n}のみで指定した場合は前の文字がn個という意、{n,m}で指定した場合は前の文字がn個以上m個以下ということを表します。
文字列を維持した置換
[編集]準備
[編集]まず、テキストエディタに次の文章を入力してください。
ウィキペディアは百科事典。
ウィクショナリーは辞書。
ウィキブックスは教科書。
ウィキクォートは?
と入力しましょう。
置換
[編集]さて、ようやく本題です。ただの置換なら検索だけで事足りますが、ここでは文字列を維持したまま置換する方法を説明します。具体的に言えば、「ウィキメディア」→「メディアウィキ」のような置換です。
このような置換を行うときにはキャプチャというものを使い、()を用います。グループ化で使用する括弧と同じ物です。「(検索する文字列)」「\1[5]」というように指定します。
文字列を分解する
[編集]「ウィキなんとか」(「なんとか」はいろいろなウィキサイト名です)というような文字列を「なんとかウィキ」に変換するには、まず「ウィキなんとか」を「ウィキ」と「なんとか」に分割する必要があります。それぞれを丸括弧で囲み、「(ウィキ)([ァ-ンー]+)」としましょう。
文字列を置換する
[編集]()で囲った文字列は、前から順に\1、\2といったように参照できます。ですからこの場合は、
検索する文字列:(ウィキ)([ァ-ンー]+) 置換する文字列:\2\1
としましょう。
復習がてら角括弧の中の意味を解釈してみましょう[6]。
さて、下のようになったでしょうか。
ペディアウィキは百科事典。
ウィクショナリーは辞書。
ブックスウィキは教科書。
クォートウィキは?
グループ化とキャプチャ
[編集]次のように入力したとします。
検索する文字列:私は(Japan|Japón)出身の(.+)です。 置換する文字列:私は日本出身の\1です。
結果はこのようになるはずです。
私はJapan出身のコックです。→ 私は日本出身のJapanです。
コックであるべきところがJapanになっています。なぜでしょうか。これは丸括弧にグループ化とキャプチャという二つの意味が存在することが原因です。
検索する文字列:私は(Japan|Japón)出身の(.+)です。 置換する文字列:私は日本出身の\2です。
とすれば、
私はJapan出身のコックです。→ 私は日本出身のコックです。
となりますが、いちいち番号を変えるのはめんどうでしょう。そのような場合、
検索する文字列:私は(?:Japan|Japón)出身の(.+)です。 置換する文字列:私は日本出身の\1です。
とすることができます。?:でキャプチャの意味を消している訳です。
脚注
[編集]- ^ 秀丸エディタ、サクラエディタ、Mery、何でも結構です。立項者のテキストエディタはEmEditor(無料版)でしたので、これにすると同じ結果が得られるはずです。迷ったら選んでみるといいかもしれません。
- ^ 「.+?」のように「?」をつけることで最小マッチを実現できます。ちなみに言うと「.+?」は.と同じ結果を出します。
- ^ 「あ」と「う」の間には「ぃ」も「ぅ」もあります。
- ^ ただ、これを上の文字列に行った場合、「ウィキペディアは」が検索されるでしょう。これは「ン」以外なら何でもよい、という意味になるからです。その上、仮に「ウィキペディア」だけが行にあってもそれは検索されません。次にくる「ン」ではない1文字がないからです。
- ^ テキストエディタによっては$1かもしれません。ただ、これはPybotの使用を念頭に置いたものなので\1を使用します。AWBの場合は$1を使用します。
- ^ 「ァ」から「ン」と「ー」を対象にしています。