【问题标题】:(?P<name>.*?) retrieve empty string when groups(?P<name>.*?) 分组时检索空字符串
【发布时间】: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*,它不会失败 - 它会很高兴地不匹配任何东西,所以.*? 没有理由匹配任何东西。将$ 放在最后是一个合适的解决方案。

标签: python regex


【解决方案1】:

您可以删除 ? 表单 (?P&lt;project_platform&gt;.*?) (甚至从每个组中删除,因为使用测试字符串时不需要它)。您可以使用groupdict() 来获取字典中的所有值:

import re
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'
result = pattern.match(test).groupdict()

{'project_id': '2DE66161-A453-4EDE-A2E8-C4104D6DFED5',
 'sln_config': 'Debug',
 'sln_platform': 'Android',
 'sln_action': 'ActiveCfg',
 'project_config': 'Debug',
 'project_platform': 'Android-arm64-v8a'}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-02-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-17
    相关资源
    最近更新 更多