3

HTML から LaTeX へのパーサーを本来の目的 (HTML のスニペットを LaTeX のスニペットに変換する) に合わせて調整しましたが、変数の入力に少し問題があります。問題は、変数に LaTeX 予約文字 (すなわち ) を含めることを許可する必要# $ % ^ & _ { } ~ \があることです。これらは、LaTeX レンダラーを強制終了しないようにエスケープする必要があります。

変換を処理するプログラムとすべてが Python で記述されているため、適切な解決策を見つけようとしました。私の最初のアイデアは単に a を実行する.replace()ことでしたが、replace では、最初のが でない場合にのみ一致させることはできません\。2 回目の試行は正規表現でしたが、惨めに失敗しました。

私が思いついた正規表現は([^\][#\$%\^&_\{\}~\\]). これが予約文字のいずれかと一致することを望んでいましたが\、前に がない場合に限ります。残念ながら、これは入力テキストの 1 文字に一致します。この正規表現でさまざまなバリエーションも試しましたが、うまくいきません。バリエーションは主に、正規表現の 2 番目の部分でスラッシュを削除/追加することで構成されていました。

誰でもこの正規表現を手伝ってもらえますか?

編集おっと、スラッシュも含まれているようです。これを投稿したときにどれだけ起きていたかを示しています:)私の場合、それらはエスケープされるべきではありませんが、回答の正規表現からそれらを削除するのは比較的簡単です。皆さんありがとう!

4

3 に答える 3

4

[^\]は 以外のすべての文字クラスです。その\ため、すべてに一致します。否定の後読みアサーションが必要な場合:

((?<!\)[#\$%\^&_\{\}~\\])

(?<!...)...が前にない限り、その後に続くものと一致します。これはpython docsで確認できます

于 2013-08-21T15:12:38.947 に答える
1

正規表現は、最初と最後のの([^\][#\$%\^&_\{\}~\\])間に見つからないものと一致するため、必要なものを除いてすべてに一致する必要があります。[]

括弧を移動すると、元の正規表現が修正されます([^\\])[#\$%\^&_\{\}~\\]

エスケープしたいものの前の文字と一致しない正規表現の lookbehindsを使用してみます。私は正規表現の専門家ではないので、より良いパターンがあるかもしれませんが、これでうまくいくはず(?<!\\)[#\$%\^&_\{\}~\\]です。

于 2013-08-21T15:18:42.663 に答える
1

エスケープされたバックスラッシュが前にある特殊文字を削除せずに、エスケープされていない特殊文字を探している場合 (たとえば、 の最後のバックスラッシュに一致させたい場合abc\\\def)、これを試してください。

(?<!\\)(\\\\)*[#\$%\^&_\{\}~\\]

これは、偶数 (0 を含む) のバックスラッシュが前に付いた任意の特殊文字と一致します。文字の前に任意の数のバックスラッシュのペアを付けることができ、それらのバックスラッシュの前に別のバックスラッシュを付けることができないことを示す否定的な後読みがあります。

一致にはバックスラッシュが含まれますが、それらすべての前に別のバックスラッシュを付けると、特殊文字をエスケープするのと同じ効果が得られます。

于 2013-08-21T15:50:46.067 に答える