拆分多个(嵌套的)python子正则表达式定义

时间:2019-04-08 21:52:18

标签: python regex

我有一个(可能是)行拆分的定义文件,该文件具有以下相似的模式:

group-definition "first-regex" "second-regex"

这两个子正则表达式都是实际的正则表达式,我需要检查“ main”语法。 Python返回值应该为我提供以下数据:

  • 实际的组定义语法
  • 我需要作为独立正则表达式进一步处理的第一个正则表达式
  • 作为第二个正则表达式,我需要再次进行进一步处理

此外,子正则表达式定义可能同时使用单引号和双引号,因此以下语法也可能是正确的:

definition "first-regex.*" 'second-regex[0-9]' #some comment

我还需要找出语法是否正确,因此以下字符串将不会被识别为正确的

something-right "something wrong' 'really-\.wrong" wtf

那是因为我以后需要2个正则表达式来处理,并且没有添加任何其他数据(除非注释以“#”或“;”开头)。

不幸的是,我对regex的经验并不深,但是我知道使用类似这样的方法无法按预期进行:

[\.]* (\".+?\")|(\'.+?\')[\ ](\".+?\")|(\'.+?\')

我想我需要更深入的知识来了解正则表达式子组的工作方式,但是我还无法理解如何正确地使它们正确。

我知道有关此类主题的问题和答案很多,但是我找不到适合此类问题的正确搜索上下文。

1 个答案:

答案 0 :(得分:1)

您在正确的轨道上。我假定以下所有内容均为有效声明

definition 'regex1' "regex2"
definition   # Comment
    'regex1' # Comment
    'regex2'

您可能想调查命名的捕获。您的模式应允许在每个参数之间添加注释或空格。而且您必须记住使用re.S标志,该标志将允许您使用'。'捕获'\ n'。

import re

pattern = """(?P<definition>[\w\-]+)    # Your definition equivalent to [a-zA-Z\-_]
             (?P<break1>(\s|#.*?\n)*?)  # Optional to match comments and spaces
             (?P<reg1>\'.*?\'|\".*?\")  # Regex pattern1
             (?P<break2>(\s|#.*?\n)*?)  # Another optional break
             (?P<reg2>\'.*?\'|\".*?\")  # Pattern2 """

with open('your_document', 'r') as f:
     for match in re.finditer(pattern, f.read(), re.X | re.S):
         # do something with each match

re.X允许模式变得冗长。如前所述,re.S将允许您在中断子组中匹配新行。 finditer 是很多次匹配的非常有用的工具,因为它将找到所有非重叠的匹配并产生匹配。

(?P<name>pattern)允许按名称访问子捕捉。因此,您可以通过以下方式访问它们:

match['definintion']
match['reg1']
match['reg2']

阅读documentation以获得更多信息