我有一个(可能是)行拆分的定义文件,该文件具有以下相似的模式:
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的经验并不深,但是我知道使用类似这样的方法无法按预期进行:
[\.]* (\".+?\")|(\'.+?\')[\ ](\".+?\")|(\'.+?\')
我想我需要更深入的知识来了解正则表达式子组的工作方式,但是我还无法理解如何正确地使它们正确。
我知道有关此类主题的问题和答案很多,但是我找不到适合此类问题的正确搜索上下文。
答案 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以获得更多信息