
CATツールで使える正規表現・第10回
この連載では、翻訳の現場で役に立つ正規表現を取り上げながら、memoQやTrados Studio、XTMのようなCATツールで利用できる正規表現について解説しています。
前回までで、かなり高度な正規表現も含め、さまざまな正規表現を紹介してきましたが、まだ触れていないメタ文字がいくつか残っています。今回は、それらのメタ文字を紹介します。
位置にマッチする「^」と「$」
前回紹介した「先読み」と「後読み」は、マッチに条件をつけるという意味でアサーション(assertion)と呼ばれますが、長さ0の文字列(すなわち文字列内の位置)にマッチするという意味で0幅(zero-width)マッチとも呼ばれます。
正規表現のメタ文字の中にも、位置にマッチするものがあり、それらはアンカー(anchor)と呼ばれます。よく使われるアンカーは、文字列(CATツールなら翻訳単位)の冒頭にマッチする「^」と、末尾にマッチする「$」です。
たとえば、^田は、「田中」という翻訳単位の「田」にはマッチしますが、「中田」という翻訳単位の「田」にはマッチしません。同様に、中$は、「田中」の「中」にはマッチしますが「中田」の「中」にはマッチしません。
「^」と「$」を両方使って^田中$とすると、「田中」という2文字の翻訳単位のみにマッチして、それ以外のあらゆる翻訳単位にマッチしません。^[0-9]+$なら、半角数字のみからなる翻訳単位にマッチして、半角数字以外の文字を1つでも含む翻訳単位にはマッチしません。空の翻訳単位は^$で検索できます。
また、分かち書きされた単語の境界にマッチする\bもあります。日本語ではほとんど出番がありませんが、たとえば英語の不定冠詞(つまり「a」か「an」、文頭では「A」か「An」)を\b[Aa]n?\bで検索できます。
\bには否定形\Bがあります。つまり、\Bは単語の境界でない位置にマッチします。単語の冒頭でないところにある大文字を検索したいなら、正規表現は\B[A-Z](より正確には\B[\p{Lu}\p{Lt}])となります。
回数を指定する「{ }」
さて、前回、長音記号「―」で終わるカタカナ語を検索する正規表現として[ァ-ヴー]+ー(?![ァ-ヴ])を作りました。カタカナ語の表記ルールにもいろいろありますが、その1つに、カタカナ語が2音以下なら末尾の長音記号をつけるが3音以上なら省くというものがあります。このルールに違反したカタカナ語を正規表現で検索できるでしょうか。
前回作った正規表現は、末尾が長音記号でありさえすれば、「キー」や「エラー」のような2音以下のカタカナ語にもマッチしてしまいます。それは、[ァ-ヴー]+が「1文字以上のカタカナ」にマッチするからです。これを「3文字以上のカタカナ」にできないでしょうか。
正規表現では、「{ }」の中に数字を書くことで、任意の繰り返し回数を指定できます。たとえばゴー{2}ルは、「ゴーール」にマッチしますが、「ゴール」にも「ゴーーール」にもマッチしません。
さらに、「{n,m}」とすることで、n回以上m回以下の繰り返しを指定できます。上限を省略して「{n,}」ならn回以上になります。したがって、「{0,1}」は「?」と同じであり、「{0,}」と「{1,}」はそれぞれ「」と「+」と同じです。なお、「{n,m}」も「」や「+」と同じく貪欲です。怠惰にしたければ「{n,m}?」とします。
これを使えば、「3文字以上のカタカナ+長音記号」であるカタカナ語は[ァ-ヴー]{3,}ー(?![ァ-ヴ])で検索できます。これで、「コンピューター」や「サーバー」を検出して「キー」や「エラー」を無視できます。もっとも、「シャワー」のように3文字以上だけれど2音以下だったり、「サーバーエラー」のように複合語だったりすると困ってしまいますが、ここでは、多少の誤検出には目をつぶることにしましょう。
繰り返しを探せ
日本語でよくある誤記の1つに、助詞のの連続ががあります、もとい、助詞の連続があります。正規表現の後方参照(backreference)を使うと、このような繰り返しを検出できます。
ここでは、検出すべき助詞を「が」「は」「の」「を」の4つだとします。そのいずれかを2回繰り返すからといって[がはのを]{2}としてしまうと、「ものがある」の「のが」や「席をはずす」の「をは」などにもマッチしてしまいます。[がはのを]がいずれかの助詞にマッチした後は、その助詞がもう一度繰り返されているかどうかを判定しなければなりません。
そこで必要となるのが「( )」です。このメタ文字は、正規表現をグループ化するものとしてすでに登場しましたが、実はもう1つ、マッチした内容を覚えるという機能も持っています。
そして、覚えた内容を、同じ正規表現の中で後から振り返って参照するには「\1」「\2」「\3」・・・と書きます。この数字は、括弧を開いた順序に対応します。つまり、「\1」は最初に開かれた括弧の中のパターンにマッチした文字列を表し、「\2」は2番目に開かれた括弧の中のパターンにマッチした文字列を表します。
そこで、([がはのを])\1とすれば、「のの」や「がが」にマッチして「のが」や「をは」にはマッチしない正規表現となります。もっとややこしい例を挙げれば、(([0-9])\2([0-9]))-\3\1は、「112-2112」「009-9009」などにマッチします。
なお、グループ化だけして覚える必要がない場合は「(?:パターン)」とします。先読みと後読みも内容を記憶しません(もっとも、記憶するべき内容がありませんが)。記憶しない括弧は番号も増やしません。たとえば、(?<=1)(?:2|3){2}([0-9])\1+は「12300」の「2300」や「133555」の「33555」などにマッチします。
今回のまとめと次回の予告
今回は、これまで紹介していなかった「^ $ { }」の各メタ文字と、後方参照を解説しました。これで、正規表現における14のメタ文字がすべて登場したので、次回は、これらを駆使して、さまざまな条件で文字列を検索します。
川村インターナショナルの翻訳サービス
川村インターナショナルでは、AIや機械翻訳の活用、プロセスの自動化やデジタル化による翻訳業務効率化ソリューションをご提案します。翻訳支援ツールの導入を検討している、自社の翻訳資産を活用して機械翻訳エンジンをカスタマイズしたい、など翻訳業務の効率化をご検討中の方は、ぜひお気軽にお問い合わせください。
関連記事