Cのマクロ宣言の名前が大文字であるかどうかを判断するために正規表現を書き込もうとしています:
#define MY_MACRO
(バックスペースやハイフンなどの特殊文字を考慮せずに)大文字のみを検出するために、次の正規表現を使用しています。
"#define +[^A-Z]+"
マクロが完全に大文字の場合は機能しますが、次のような場合は失敗します。
#define Mymacro
このケースを判別できる正規表現は何ですか?
検出する#define MixedCase
が一致し#define ALLUPPERCASE
ないには、否定的な先読みアサーションが必要です。
r'#define\s+(?![A-Z_]+\b)[A-Za-z_]+\b'
\b
単語の境界に一致します。単語が終了する場所。おそらく、単語の後の空白または行の終わりが原因です。
(?!..)
否定的な先読みアサーションは、大文字と小文字が混在する単語との一致を許可する前に、次の単語がすべて大文字ではないことを確認します。
_
一致する文字クラスにもアンダースコアを含めていることに注意してください。
マクロ名に数字を含めることをお勧めします。結局のところ、数字は有効です。
r'#define\s+(?![A-Z0-9_]+\b)\w+\b'
次に、2番目の文字クラスをに簡略化できます。\w
これは。と同じ[A-Za-z0-9_]
です。
正規表現はすべてを行う必要がありますか?すべての#define
sを正規表現と照合し、非常に単純なPythonコードを使用して、マクロ名の大文字をテストすることができます。
macro_defn = re.compile(r'#define\s+(\w+)')
for line in code_source:
macro_match = macro_defn.match(line)
if macro_match:
macro_name = macro.group(1)
if macro_name.upper() != macro_name:
print line