【发布时间】:2023-04-01 05:41:01
【问题描述】:
这不是询问如何使用re.findall() 或全局修饰符(?g) 或\g 的问题。这是在询问如何将n 组与一个正则表达式匹配,n 在 3 和 5 之间。
规则:
- 需要忽略第一个非空格字符为
#(cmets) 的行 - 需要至少获得三个项目,始终按顺序排列:
ITEM1、ITEM2、ITEM3class ITEM1(stuff)model = ITEM2fields = (ITEM3)
- 需要获取以下任何匹配项(如果存在)(未知顺序,可能会丢失)
write_once_fields = (ITEM4)required_fields = (ITEM5)
- 需要知道哪个匹配是哪个,因此要么按顺序检索匹配,如果没有匹配则返回
None,或者检索对。
我的问题是这是否可行,如何实现?
我已经做到了这一点,但它还没有处理 cmets 或未知订单,或者如果某些项目丢失,并且当您看到下一个 class 定义时停止搜索这个特定的正则表达式。 https://www.regex101.com/r/cG5nV9/8
(?s)\nclass\s(.*?)(?=\()
.*?
model\s=\s(.*?)\n
.*?
(?=fields.*?\((.*?)\))
.*?
(?=write_once_fields.*?\((.*?)\))
.*?
(?=required_fields.*?\((.*?)\))
我需要条件吗?
感谢您的任何提示。
【问题讨论】:
-
这似乎不太适合正则表达式。您应该改为解析它。
-
@AdamSmith 有没有办法在没有正则表达式的情况下解析它?
-
AdamSmith 是对的,只需遍历文件中的行,如果它们以“#”开头,则跳过,然后选择一个函数来根据其第一个单词解析该行。您可以建立一个配对列表或其他任何东西,然后验证结果。