我有一个正则表达式模式,它代表我正在尝试解析的语言中的有效变量名称:
R'\b([A-Z][A-Z0-9_]{0,35}\b'
(例如 VAR_NAME、TABLE_READ、SOME_OTHER_VAR 等..)
但是,如果是以下情况,我不想捕获此模式:
到目前为止,使用第三方正则表达式模块(https://github.com/mrabarnett/mrab-regex v2023.8.8),我已经能够提出以下内容:
R'(?!\bOR\b|\bAND\b|\bIF\b|\bTHEN\b|\bELSE\b|\bREAD_GENERIC_TABLE\b)(?<!;.*)\b([A-Z][A-Z0-9_]{0,35})\b'
但我不太清楚如何处理双引号部分(#3)。有人可以给我一些指导吗?
我一直在运行以下文本作为测试:
test_string = """ IF t = 0 OR t > POL_TERM_M THEN 0 ELSE IF mult(t+11,12) AND POLICY_YEAR <= TBL_VAL_INT_Y THEN READ_GENERIC_TABLE(TBL_VAL_INT, "Y", ENTRY_YEAR, MVA_OPT, "VAR_NAME", POLICY_YEAR(t)) ELSE VALINT_EL_PC(t-1) """
它应该捕获变量名称集:
POL_TERM_M, POLICY_YEAR, TBL_VAL_INT_Y, TBL_VAL_INT, ENTRY_YEAR, MVA_OPT
和 VALINT_EL_PC
我尝试了以下表达式,但它随后开始捕获关键字:
R'(?!\bOR\b|\bAND\b|\bIF\b|\bTHEN\b|\bELSE\b|\bREAD_GENERIC_TABLE\b)(?<!;.*)[^"]\b([A-Z][A-Z0-9_]{0,35})\b[^"]'
您可能需要另一个看起来是否定的断言来排除双引号部分。我用下面的代码进行测试,它返回正确。
import re
test_string = """ IF t = 0 OR t > POL_TERM_M THEN 0 ELSE IF mult(t+11,12) AND POLICY_YEAR <= TBL_VAL_INT_Y THEN READ_GENERIC_TABLE(TBL_VAL_INT, "Y", ENTRY_YEAR, MVA_OPT, "VAR_NAME", POLICY_YEAR(t)) ELSE VALINT_EL_PC(t-1) """
pattern = r'\b(?!OR\b|AND\b|IF\b|THEN\b|ELSE\b|READ_GENERIC_TABLE\b)(?<!;)(?<!")([A-Z][A-Z0-9_]{0,35})\b'
matches = re.findall(pattern, test_string)
print(set(matches))