我想用这种嵌套格式分析一个文件:
/begin FUNCTION
foo
"1.2.12 foo_long"
/begin DEF1
/end DEF1
FUNCTION_VERSION "1.2.0"
/end FUNCTION
/begin FUNCTION
bar
""
/end FUNCTION
/begin FUNCTION
urbi
"10.15.23 urbi_long"
/begin DEF1
/end DEF1
FUNCTION_VERSION "10.15.3"
/end FUNCTION
我想从中提取函数名、长名和版本号。你知道吗
我使用以下正则表达式执行此操作:
sSearch = r'/begin FUNCTION\s+(\w*)\s+"[\d\._\s]*([^"]+)*"(.*?)FUNCTION_VERSION\s+"([^"]+)"\s+/end FUNCTION'
lMatches = re.findall(sSearch, sFileContent, re.S)
dMatches = {args[0]: [args[3], args[1]] for args in lMatches if args}
print(dMatches)
这导致:
{'foo': ['1.2.0', 'foo_long'], 'bar': ['10.15.3', '']}
来自urbi
的函数版本被错误地分配给bar
。我根本不希望bar
返回,因为它不包含函数版本。你知道吗
当发现end FUNCTION
没有前导function version
时,如何调整regex,使其在bar
之前释放/begin FUNCTION
发生?你知道吗
我希望输出为:
{'foo': ['1.2.0', 'foo_long'], 'urbi': ['10.15.3', 'urbi_long']}
我也困惑的是为什么我需要在中间添加一个不必要的^ {CD8}}捕获组。它不也应该与一个简单的.*
一起工作吗?你知道吗
试试这个正则表达式:
Click for Demo
说明:
\/begin FUNCTION\s*
-匹配/begin FUNCTION
,后跟0+空格(\w+)
-匹配1+个单词字符,并将其捕获到组1中。这是函数的名称\s*"
-匹配0+个空格,后跟"
(?:(?!end FUNCTION)[\s\S])*?
-匹配任何字符直到以短语end FUNCTION
开头的标记(\w+)
-匹配1+个单词字符并将其存储在组2中。这就是你的名字"[\s\S]*?FUNCTION_VERSION\s*"
-匹配"
,后跟0+个字符,后跟FUNCTION_VERSION
,后跟0+个空格,后跟"
([^"\s]+)
-匹配1+个既不是"
也不是空白的字符。这是在组3中捕获的,包含您的版本号。你知道吗"
-匹配"
您可以使用
negative lookahead
执行此操作,如下所示:这是一种使用
Lookbehind & Lookahead
的方法。你知道吗演示:
输出:
相关问题 更多 >
编程相关推荐