【发布时间】:2021-12-31 02:01:16
【问题描述】:
我正在使用python正则表达式解析visual studio .sln文件,代码如下。
pattern_project_config = r'\s*\{(?P<project_id>.*?)\}\.(?P<sln_config>.*?)\|(?P<sln_platform>.*?)\.(?P<sln_action>.*?)\s=\s(?P<project_config>.*?)\|(?P<project_platform>.*?)\s*'
test = r'{2DE66161-A453-4EDE-A2E8-C4104D6DFED5}.Debug|Android.ActiveCfg = Debug|Android-arm64-v8a'
pattern = re.compile(pattern_project_config)
matches = pattern.match(test)
project_id = matches.group('project_id')
sln_config = matches.group('sln_config')
sln_platform = matches.group('sln_platform')
sln_action = matches.group('sln_action')
project_config = matches.group('project_config')
project_platform = matches.group('project_platform')
print(project_id, sln_config, sln_platform, sln_action, project_config, project_platform)
但是为什么最后一个“project_platform”是空字符串,我的正则表达式语句有什么问题?
【问题讨论】:
-
你的输入字符串是什么?其他值是否正确?
-
输入字符串是“test”变量。我注意到将 $ 附加到正则表达式模式可以解决我的问题。但我仍然想知道这种行为的理论。
-
.*?是一个非贪婪匹配 - 它最初不会匹配任何内容,并且只会在必要时增加大小(一次重复一次)以使其余的正则表达式成功。但在这种情况下,其余的是\s*,它不会失败 - 它会很高兴地不匹配任何东西,所以.*?没有理由匹配任何东西。将$放在最后是一个合适的解决方案。