
CATツールで使える正規表現・第12回
この連載では、翻訳の現場で役に立つ正規表現を取り上げながら、memoQやTrados StudioのようなCATツールで利用できる正規表現について解説しています。
前回まで、正規表現を使用して、さまざまなエラーを検出してきました。でも、そうして見つかったエラーを1つ1つ手で直すのは大変ですね。実は、一括置換にも正規表現が利用できます。
今回は、この連載の最終回として、正規表現を使用した置換について解説します。
表記揺れを直せ
たとえば、訳文で「コンピュータ」と「コンピューター」が混在しているとしましょう。これを一括置換で統一できないでしょうか。
「コンピュータ」に統一するなら、「コンピューター」を「コンピュータ」に置換するだけです。正規表現は必要ありません。
では、「コンピューター」に統一する場合はどうでしょう。「コンピュータ」を「コンピューター」に置換してしまうと、もともと「コンピューター」だったところは「コンピューターー」になってしまいます。
ここで正規表現の出番です。「コンピュータ」にはマッチするが「コンピューター」にはマッチしない正規表現で検索して、それを「コンピューター」に置換すれば一丁上がりです。第9回で紹介した先読みの否定を使えば、コンピュータ(?!ー)が目的の正規表現になります。
別の例を見てみましょう。この連載の第4回で、中黒区切りや半角スペース区切りのカタカナ語を検索しました。これらを互いに置換することもできます。
半角スペース区切りのカタカナ語を中黒区切りに置換するとして、単純に半角スペースを中黒に置換すると、カタカナ語でないところも置換されてしまいます。前後の文字がカタカナである半角スペースを中黒に置換しましょう。
つまり、(?<=[ァ-ヴー]) (?=[ァ-ヴ])を「・」に置換します。逆なら(?<=[ァ-ヴー])・(?=[ァ-ヴ])を半角スペースに置換です。
削除と挿入
ところで、文字列の置換で置換先の文字列が空だったら、どうなるでしょう。そう、置換元の文字列が削除されます。ここで置換元に正規表現を使えば、正規表現にマッチした文字列を一括削除できます。
たとえば、いくつかの翻訳単位の冒頭に余分な半角スペースが入っているとしましょう。これを削除したければ、^ を空文字列に置換します。こうすれば、文中の半角スペースが削除されることはありません。
なお、冒頭に半角スペースがいくつあっても全部削除するなら、置換元の正規表現を^ +とします。全角スペースやタブなども含めた空白文字をすべて削除するなら^\s+です。
同様に、全角文字と半角文字にはさまれた空白文字を削除することもできます。そのような空白文字を検索する正規条件は、第9回で作った(?<=[\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])です。これを空文字列に置換すればよいのです。
さて、これらの例で駆使したアンカーや先読み・後読みは、0幅マッチです。すなわち、空文字列を検索します。置換元が空文字列ということは、文字列の挿入ができるということです。
たとえば、(?<=[\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])を半角スペースに置換すれば、全角文字と半角文字のあいだに半角スペースを挿入できます。
覚えたことを思い出す
この連載の第10回で、後方参照を使って助詞の連続を検出しました。正規表現の中に「( )」があると、その中のパターンにマッチした文字列が記憶され、\1や\2でその文字列を呼び出せるのでした。
この覚えた文字列は、置換でも呼び出せます。そのためには、置換先に「$1」や「$2」と書きます。つまり、([がはのを])\1を「$1」に置換すれば、「がが」は「が」になり「はは」は「は」になります。
なお、置換先に「$」を含めたい場合は「$$」と書きます。「12.30ドル」を「$12.30」に置換したければ、([0-9]+(.[0-9]+)?)ドルを「$$$1」に置換します。
前述の、カタカナ語の区切り文字や全角文字と半角文字とのあいだを、この方法で置換することもできます。たとえば、半角スペース区切りのカタカナ語を中黒区切りに置換するには、([ァ-ヴー]) ([ァ-ヴ])を「$1・$2」に置換します。
ただし、この方法には注意が必要です。「レオナルド・ダ・ビンチ」のように、区切りと区切りのあいだが1文字だけの場合、両方の区切りを一度に置換することができません。そのため、一括置換を2回繰り返す必要があります。
覚えた文字列の順序を変えることもできます。たとえば([1-9][0-9])/([1-9][0-9])という正規表現を「$2分の$1」に置換すれば、「1/3」のような分数が「3分の1」のように置換されます。
今回のまとめ
今回は、正規表現を使った置換を紹介しました。
これは非常に強力ですが、強力すぎて、意図しないものまで置換してしまうということが起こりがちです。それを防ぐには、一括置換ではなく、1つずつ検索と置換を実行するとよいでしょう。それでも手で直すよりずっと速いはずです。必要ないものが検索されてしまったら、正規表現を練り直しましょう。
この連載も今回で締めくくりとなります。正規表現は、学習コストは高いかもしれませんが、似たような修正を何度も繰り返しているなら、きっと役に立ちます。
日々の業務の効率化に、ぜひ正規表現を役立ててください。
川村インターナショナルの翻訳サービス
川村インターナショナルでは、AIや機械翻訳の活用、プロセスの自動化やデジタル化による翻訳業務効率化ソリューションをご提案します。翻訳支援ツールの導入を検討している、自社の翻訳資産を活用して機械翻訳エンジンをカスタマイズしたい、など翻訳業務の効率化をご検討中の方は、ぜひお気軽にお問い合わせください。
関連記事