Python 正则表达式匹配模式(如果不在双引号中或等于关键字列表)

问题描述 投票:0回答:1

我有一个正则表达式模式,它代表我正在尝试解析的语言中的有效变量名称:

R'\b([A-Z][A-Z0-9_]{0,35}\b'
(例如 VAR_NAME、TABLE_READ、SOME_OTHER_VAR 等..)

但是,如果是以下情况,我不想捕获此模式:

  1. 从关键字列表中:OR、AND、IF、THEN、ELSE、READ_GENERIC_TABLE
  2. 前面有分号 (;),因为它会开始这种语言的内联注释
  3. 立即用双引号括起来(例如 VAR_NAME 有效,但“VAR_NAME”无效)

到目前为止,使用第三方正则表达式模块(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[^"]'

python python-3.x regex-lookarounds regex-negation python-regex
1个回答
0
投票

您可能需要另一个看起来是否定的断言来排除双引号部分。我用下面的代码进行测试,它返回正确。

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))
© www.soinside.com 2019 - 2024. All rights reserved.