FORTRAN 文字列リテラルを識別する必要があるplyを使用してパーサーを作成しています。これらは一重引用符で囲まれ、エスケープ文字は二重の一重引用符です。すなわち
'I don''t understand what you mean'
エスケープされた有効な FORTRAN 文字列です。
Ply は正規表現で入力を受け取ります。これまでの試みはうまくいかず、その理由がわかりません。
t_STRING_LITERAL = r"'[^('')]*'"
何か案は?
文字列リテラルは次のとおりです。
したがって、正規表現は次のとおりです。
r"'(''|[^'])*'"
次のようなものが必要です。
r"'([^']|'')*'"
これは、一重引用符の内側に二重引用符または非引用符を使用できることを示しています。
大括弧は文字クラスを定義し、一致する文字または一致しない文字をリストします。それよりも複雑なことは許可されないため、括弧を使用して複数文字のシーケンスに一致させようとしても('')
機能しません。代わりに、[^('')]
文字クラスは と同等です[^'()]
。つまり、一重引用符または左または右の括弧以外のものに一致します。
通常、問題を引き起こしている特定の文字列リテラルを解析するための簡単な方法を簡単に取得できますが、一般的な解決策として、pyparsing モジュールから文字列リテラルの非常に強力で完全な正規表現を取得できます。
>>> import pyparsing
>>> pyparsing.quotedString.reString
'(?:"(?:[^"\\n\\r\\\\]|(?:"")|(?:\\\\x[0-9a-fA-F]+)|(?:\\\\.))*")|(?:\'(?:[^\'\\n\\r\\\\]|(?:\'\')|(?:\\\\x[0-9a-fA-F]+)|(?:\\\\.))*\')'
FORTRAN の文字列リテラルと Python の文字列リテラルの大きな違いについてはよくわかりませんが、それ以外の場合は便利なリファレンスです。
import re
ch ="'I don''t understand what you mean' and you' ?"
print re.search("'.*?'",ch).group()
print re.search("'.*?(?<!')'(?!')",ch).group()
結果
'I don'
'I don''t understand what you mean'