CATツールで使える正規表現・第8回
この連載では、翻訳の現場で役に立つ正規表現を取り上げながら、memoQやTrados StudioのようなCATツール※で利用できる正規表現について解説しています。
※ CATツールとは、翻訳支援(Computer Assisted Translation)ツールの略称で、翻訳メモリや用語集を使って翻訳業務を効率化するためのツールを指します。
前回の記事では、文字クラスの減算と一般カテゴリによる文字クラスを紹介しました。今回は、その2つの実用例として、全角文字と半角文字のあいだに注目します。
目次[非表示]
全角文字と半角文字のあいだ
日本語の文章では、全角文字と半角文字が混在する場合があります。その際、全角文字と半角文字のあいだに半角スペースを入れる流儀と入れない流儀があります。そこで、全角文字と半角文字のあいだにスペースがあるバターンとないパターンを、正規表現で検索してみましょう。
そのためには、この連載の第5回で述べたように、検索すべき全角文字をきっちりと定める必要があります。ここでは、全角文字と半角文字の双方から記号を除外しましょう。記号の前後にスペースを入れるか入れないかというのは、各記号にそれぞれルールがあるので、別に扱ったほうがよいからです。
すると、「全角文字」とは、ひらがな、カタカナ、漢字、全角数字、全角アルファベットのいずれかと定義できます。また、「半角文字」は、半角数字または半角アルファベットと定義できます(半角カタカナは全角文字としましょう)。これで正規表現が作れるようになりました。
再び半角文字を探せ
記号を除く半角文字は、一般に[0-9A-Za-z]で検索します。しかし、これでは、「é」などのアクセント記号付きアルファベットや「æ」などの合字(ligature)が検索できません。これらの文字も、固有名詞などで使われることがあるので、半角文字に含めましょう。
これらの文字を含めた、いわゆるアルファベット(ラテン文字)は、漢字と同様、Unicodeではいくつかのブロックに分かれています。そのため、ブロックやコードポイントで正規表現を作るのは大変ですが、ここで一般カテゴリが役に立ちます。
ラテン文字は、Lu(Letter, uppercase: 大文字)、Ll(Letter, lowercase: 小文字)、Lt(Letter, titlecase: 大文字と小文字の合字)のいずれかのカテゴリに属します。そこで、[\p{Lu}\p{Ll}\p{Lt}]とすれば、アクセント記号付きや合字を含めたアルファベットを検索できます。
ただし、これで半角文字を検索することはできません。LuやLlには全角アルファベットが含まれているので、それを引く必要があります。さらに半角数字を加えると、記号を除く半角文字1文字を表す文字クラスは[\p{Lu}\p{Ll}\p{Lt}0-9-[A-Za-z]]となります。
もっとも、この正規表現はラテン文字だけでなくギリシャ文字やキリル文字などにもマッチしますが、それらの文字も半角文字としてよいでしょう。
再び全角文字を探せ
次に、記号を除く全角文字にマッチする文字クラスを作りましょう。
ひらがなとカタカナについては、この連載の第4回で取り上げました。また、漢字は第6回で解説しました。全角数字と全角アルファベットは[0-9A-Za-z]です。これらをつなげて文字クラスを作ってもよいのですが、それでは正規表現が長大になってしまいます。
ここでも一般カテゴリの出番です。ひらがな、カタカナ、漢字はいずれもLo(Letter, other: その他の文字)カテゴリに属します。また、漢字の繰り返しを表す「々」と長音記号「ー」はLm(Letter, modifier: 修飾文字)カテゴリに属します。したがって、記号を除く全角文字1文字を表す文字クラスを[\p{Lo}\p{Lm}0-9A-Za-z]とすることができます。
ただし、この正規表現では、日本語の文字だけでなく、ハングルやアラビア文字、ヘブライ文字など、さまざまな文字も全角文字になります。それらのうち、半角文字とみなしたい文字があるなら、全角文字の文字クラスから引いて、半角文字の文字クラスに足してください。
スペースがあるかないか
これで、全角文字と半角文字のあいだにスペースがあるパターンとないパターンを検索できます。せっかくなので、スペースについても区切り文字カテゴリZを使って、半角スペースだけでなく全角スペースなども含めるようにしましょう。
まず、全角文字と半角文字のあいだにスペースがあるというパターンは、「全角文字+1文字以上のスペース+半角文字」または「半角文字+1文字以上のスペース+全角文字」ですから、[\p{Lo}\p{Lm}0-9A-Za-z]\p{Z}+[\p{Lu}\p{Ll}\p{Lt}0-9-[A-Za-z]]|[\p{Lu}\p{Ll}\p{Lt}0-9-[A-Za-z]]\p{Z}+[\p{Lo}\p{Lm}0-9A-Za-z]で検索できます。
全角文字と半角文字のあいだにスペースがないというパターンにマッチする正規表現は、上記の正規表現からスペースを取り除いて、[\p{Lo}\p{Lm}0-9A-Za-z][\p{Lu}\p{Ll}\p{Lt}0-9-[A-Za-z]]|[\p{Lu}\p{Ll}\p{Lt}0-9-[A-Za-z]][\p{Lo}\p{Lm}0-9A-Za-z]となります。
今回のまとめと次回の予告
今回は、一般カテゴリによる文字クラスを使って、全角文字と半角文字のあいだにスペースがあるパターンとないパターンを検出する正規表現を作りました。
実は、これらの正規表現には問題があります。たとえば「4 月 1 日」という、半角スペースを3つ含む文字列に対して、全角文字と半角文字のあいだにスペースがあるパターンを検索してみましょう。まず「4 月」がマッチするのはよいのですが、次のマッチは「1 日」です。「月」と「1」のあいだにもスペースがあるのに、「月 1」が検出されません。
では、「4 月 1 日」の3つのスペースをもれなく検出することはできるでしょうか。正規表現なら、できます。次回はその方法を紹介します。
川村インターナショナルの翻訳サービス
川村インターナショナルでは、AIや機械翻訳の活用、プロセスの自動化やデジタル化による翻訳業務効率化ソリューションをご提案します。翻訳支援ツールの導入を検討している、自社の翻訳資産を活用して機械翻訳エンジンをカスタマイズしたい、など翻訳業務の効率化をご検討中の方は、ぜひお気軽にお問い合わせください。
関連記事