翻訳の手作業を効率化する「正規表現」
第5回:パターンの否定と論理和(OR)、行頭と行末
翻訳者、JTF副会長 高橋 聡
今回、タイトルが何となく難しそうですが、ご心配なく。
この辺で一度、ここまでに扱った正規表現のルールを振り返っておきましょう。
大カッコ([ ]) ― 個別または範囲で指定したうち任意の1文字
ピリオド(.) ― 任意の1文字
アスタリスク(*) ― 直前のパターン0回以上
プラス(+) ― 直前のパターン1回以上
疑問符(?) ― 0文字または1文字
中カッコ({ }) ― 繰り返し回数の指定
これだけでも、かなりいろいろな検索ができるようになります。何よりも、正規表現に必要な考え方とか姿勢の基本が少しずつ身についてきているはずです。念のため確認してみると、
正規表現を使うのは「手の効率」のため(第1回)
正規表現とは「指定したパターンとの一致を検索する仕組み」(第1回)
自分でやってみないと覚えられない(第2回)
正規表現は「よくも悪くも厳密で忠実」(第2回)
自分で考えながら試行錯誤していく過程が大切(第3回)
失敗したらその理由についても考えることが大切(第3回)
日本語を検索する場合は日本語の文法知識も少し必要(第4回)
ということを前回までにお伝えしてきました。今回の内容まで進むと、正規表現の応用範囲がさらに広がります。
今回はまず、こんな状況を想定してみます。お客さんのルールで「算用数字は、1桁なら全角、2桁以上なら半角」と指定されました(珍しいケースですが、ときどきあります)。ところが、めったにないことだったので、1桁にもすべて半角の数字を使ってしまいました。この原稿をチェックして該当箇所を見つけるには、どうすればいいでしょうか。上のまとめにもあるとおり、「自分で考えながら試行錯誤」することが大切です。まず、
数字を検索するパターンは[0-9]
これはもう覚えましたよね。しかし、これだと2桁以上の数字もヒットしてしまいます。ヒットさせたいのは1桁の数字だけ……ということは……と考えていって、
前後は数字ではないはず!
というところにまで考えが至れば正解です。この辺の思考プロセスは、パズルみたいな感覚です。
そして、ここで登場するのが「指定したパターンを否定する」つまり「指定したパターンではない」ことを指定する新しい記号、キャレット(^)です。ただし、これを大カッコ[ ]と組み合わせて、しかも必ず大カッコの中の先頭で使います。大カッコでは、個別または範囲で文字を指定できましたから、そのパターンを否定=除外するのです。
たとえば、ここでは「数字ではない」文字を指定したいので、
[^0-9]
という形を使います。1桁の数字は[0-9]で、その前後はどちらも「数字ではない」つまり[^0-9]の形にヒットするはずです。つまり
[^0-9][0-9][^0-9]
これで、「1桁の半角数字」を検索できることになります。
また、範囲ではなく単独の1文字を否定したり、個別に指定した複数の文字も指定できるので、たとえば
コンピュータ[^ー]
とすれば「コンピュータ」のうしろに長音記号が続いていない形がヒットします。このパターンは、長音記号がないカタカナ語を検索するときにいろいろ使えるので、ぜひ覚えておきましょう。
個別に複数の文字を指定する場合は、
ナビゲーション[^さしすせ]
のように指定します。これは、「ナビゲーション」のうしろに「さ・し・す・せ」のどの1文字も続かないというパターンです。「ナビゲーション」というカタカナ語は使ってよいが、「ナビゲーションする」とか「ナビゲーションし・ます」のように動詞として使ってはいけないというルールのときに違反箇所を検索できます。
繰り返しますが、キャレット(^)は必ず大カッコ[ ]の中で必ず先頭に使ってください。それ以外の位置にあると否定=除外の機能をもちません。たとえば
[a-z^st]
これは、「小文字アルファベットa~zのいずれかにヒットする、ただしsとtは除く」と指定したかったのかもしれませんが、機能しません。a~zのいずれか、またはキャレット自体、またはsかtを検索してしまいます。
さらに、キャレット(^)が否定=除外の機能をもつのは大カッコの中だけで、それ以外で使うとキャレット(^)は「行頭」を指定する文字になります。したがって、
^「
こうすると、「カギカッコで始まる行」を探せることになります。ついでに「行末」を示す記号もここで紹介しておくと、ドル記号($)です。否定=除外の[^]と$を組み合わせると、こんな検索が可能になります。
[^。、]$
読み解いてみてください。「行末が句読点で終わっていない」パターンを検索できることがお分かりでしょうか。
ちなみに、否定=除外の機能はMicrosoft Wordのワイルドカードにもあって、ただし使う文字がキャレットではなく感嘆符(!)になります。つまり、記号の違いだけ分かれば、同じ考え方を正規表現でもワイルドカードでも使えるということです。連載の第1回で、「ワイルドカードを使える人が正規表現を覚えるのはわりと簡単。その逆もまたしかりです」と書いたのは、こういうことなのです。
さて、新しく登場するもうひとつのルールが論理和(OR)です。用語としては難しそうですが、要するに「AまたはB」の「または=OR」に当たる機能です。
上で復習したように、大カッコ[ ]の中に複数の文字を指定すると、「それらのいずれか1文字」という指定になるのでした。つまり、
[春夏秋冬]
というパターンは、「春」「夏」「秋」「冬」のいずれか1文字にヒットします。あくまでも1文字ずつです。では、たとえば「日本」または「米国」のいずれかを検索したかったらどうすればいいのでしょうか。
[日本米国]
これでも、「日本」または「米国」がある位置が何となく見つかりますが、もちろん「日本」または「米国」にヒットしているわけではなく「日」「本」「米」「国」のいずれか1文字にヒットしているにすぎません。「お米」とか「日差し」なども検索されてしまいます。
つまり、1文字ずつではなく「日本」または「米国」のように、2文字以上のパターンの「いずれか」を検索したければ、別の方法が必要だということです。この指定には、パイプ文字(|)を使います(キーボード上では、Backspaceキーの左にあります。そのさらに左がキャレットです)。
日本|米国
とすれば、「日本」または「米国」のいずれかにヒットします。パイプ文字の前後に空白は入れないでください。また、
insight|洞察
のように指定すれば、原文中のinsightと、訳文中の「洞察」をまとめて検索することもできます(といっても、これはいわゆる翻訳支援ツールのように原文列と訳文列がきっぱり分かれているケースではなく、Wordやテキストエディターなどで「原文のうしろに訳文を入力していく」という入力スタイルの場合に限られます。こういうスタイルで入力している人が、今どきはどのくらいいるのか分かりませんが、私はよくやります)。
先ほどは「AまたはB」と説明しましたが、選択肢はAとBの2つとは限らないので、
ドル|円|ポンド|ウォン
のようにいくつでも指定できます。並べる数に特に制限はありません。
にゃ|にゅ|にょ|みゃ|みゅ|みょ|ぱ|ぴ|ぷ|ぺ|ぽ|ふぁ|ふぃ|ふぇ|ぢ
この例ではパイプ文字を14個使っていますが、このくらい平気です。ちなみに、これは通常の文章にはほぼ出てきそうにない文字のつながりを検索するパターンです。「ぱ」が入っているので、「いっぱい」などはヒットしますが、作業翻訳の通常の文体ではめったに出てくるものではありません。
このパイプ文字を丸カッコ( )と組み合わせると、さらに実用的な検索が可能になります。
industr(y|ies)
これ、想像できますよね。industryという単語の複数形と単数形を一度に検索できるパターンです。もちろん、
industry|industries
のように単数形と複数形をそのまま並べてもいいのですが、丸カッコとの組み合わせを応用すれば、
選択肢(、|て|た|ます|まし|ませ|な)
こんな指定もできるのです。これは何をしているかというと、「選択します」「選択した」「選択しない」などと入力したつもりで、うっかり「選択肢」と入力してしまった場合を検索しています。
では、第1回から今回までの総復習として、以下のパターンについて考えてみてください。
インター?フェ[イー]?ス
こう指定すると、interfaceの訳語として想定されるパターンをすべて検索できることがお分かりでしょうか。つまり、「インターフェース」「インタフェース」「インターフェイス」「インタフェイス」「インターフェス」「インタフェス」の6通りです(これ以外の表記って、ありませんよね? 最後の2つでさえめったにないはずです)。解説は、次回の冒頭で。
(次回につづく)
○執筆者プロフィール
高橋 聡(たかはし あきら)
CG以前の特撮と帽子と辞書をこよなく愛する実務翻訳者。フェロー・アカデミー講師。日本翻訳連盟(JTF)理事・副会長。学習塾講師と雑多翻訳の二足のわらじ生活と、ローカライズ系翻訳会社の社内翻訳者生活を経たのち、2007年にフリーランスに。現在はIT・マーケティングなどの翻訳を手がけており、翻訳フォーラム(fhonyaku.jp)などの翻訳者グループで情報発信も行う。訳書に『機械翻訳:歴史・技術・産業』(森北出版)、『現代暗号技術入門』『イーサリアム 若き天才が示す暗号資産の真実と未来』(ともに日経BP)など。著書に『翻訳者のための超時短パソコンスキル大全』(KADOKAWA)、共著に『翻訳のレッスン』(講談社)がある。