【问题标题】:Optional Named Capture group with suffix带后缀的可选命名捕获组
【发布时间】:2020-07-09 22:30:10
【问题描述】:

我有一个命令说明

RENAME_SECTION file::section [new_file::]new_section

filesectionnew_section 是必需的,new_file 是可选的。

Than 表示所有下一个表达式都将匹配:

RENAME_SECTION io.cfg::BUS1 io.cfg::BUS3
RENAME_SECTION io.cfg::BUS2       io_new.cfg::BUS2
RENAME_SECTION io.cfg::VID VID1

我尝试使用 Python re.search(pattern, config_line) 使用模式获取所有提供的参数

(?P<command>RENAME_SECTION\s)\s*(?P<file>\S+)::(?P<section>.*)\s+(?P<target_file>\S*)[::]?(?P<target_section>.*)

此模式匹配前两个情况,但不匹配第三个,原因是缺少最后一个::

如何将::target_file 命名的捕获组捆绑在一起?

【问题讨论】:

  • file:: 不是可选的:它是部分的来源。如果未指定new_file,则目标文件与源文件相同。
  • 我看到您在问题中明确表示。抱歉,添麻烦了。当我认为您已经看到此评论时,我会删除它。

标签: regex python-3.x


【解决方案1】:

您可以使用可选匹配和锚点尝试此正则表达式:

^(?P<command>RENAME_SECTION)\s+(?P<file>\S+?)::(?P<section>\S+)\s+(?:(?P<target_file>\S+?)::)?(?P<target_section>.+)$

RegEx Demo

(?:(?P&lt;target_file&gt;\S+?)::)? 是一个可选的非捕获组,它使匹配的target_file 和尾随的:: 可选

【讨论】:

    【解决方案2】:

    你可以考虑这样的模式

    (?P<command>RENAME_SECTION)\s+(?P<file>\S+)::(?P<section>\S+)\s+(?:(?P<target_file>[^\s:]+)::)?(?P<target_section>\S+)
    

    请参阅regex demo。如果您打算将整个字符串与模式匹配,请在开头添加^,在末尾添加$

    详情

    • (?P&lt;command&gt;RENAME_SECTION) - RENAME_SECTION 字符串
    • \s+ - 1+ 个空格
    • (?P&lt;file&gt;\S+) - 1+ 个非空格
    • :: - :: 子字符串
    • (?P&lt;section&gt;\S+) - 1+ 个非空格
    • \s+ - 1+ 个空格
    • (?:(?P&lt;target_file&gt;[^\s:]+)::)? - 匹配 1 或 0 次出现的可选组
      • [^\s:]+ - 除空格和 : 字符以外的 1+ 个字符
      • :: - :: 子字符串
    • (?P&lt;target_section&gt;\S+) - 1+ 个非空格。

    【讨论】:

    • 谢谢@wiktor stribiżew,但在最后一种情况下,VID1 被标识为target_file 而不是target_section
    猜你喜欢
    • 1970-01-01
    • 2014-06-26
    • 1970-01-01
    • 2014-09-11
    • 2012-09-22
    • 1970-01-01
    • 1970-01-01
    • 2023-04-03
    相关资源
    最近更新 更多