首页 > 解决方案 > 带有可选组的 Python 正则表达式

问题描述

使用 Python,我需要解析以下字符串,可以用四种不同的方式编写:

:param MyParam: My description [MyValue] {MyGroup}  
:param MyParam: My description [MyValue]  
:param MyParam: My description {MyGroup}  
:param MyParam: My description  

期望是提取MyParam、My description、MyValue和MyGroup

我尝试了以下模式:

^\:param(?P<param>.*)\:(?P<desc>.*)\s*(\[(?P<value>.*)\])?\s*(\{(?P<group>.*)\})?$

但在所有情况下,它都太贪婪了。

使用以下一个:

^\:param(?P<param>.*)\:(?P<desc>.*) (\[(?P<value>.*)\])? (\{(?P<group>.*)\})?$

仅当根据模式预期有空格时,我才会得到有效的结果。
知道如何解决这个问题吗?

标签: pythonregex

解决方案


您可以使用此正则表达式来解析您的问题中提到的所有可能的组合:

^:param\s+(?P<param>[^:]+):\s*(?P<desc>.*?)\s*(?:\[(?P<value>[^]]*)\])?\s*(?:\{(?P<group>[^}]*)\})?$

正则表达式演示

雷克斯详细信息:

  • ^: 开始
  • :: 匹配一个冒号
  • param\s+: 匹配文本param后跟 1+ 个空格字符
  • (?P<param>[^:]+): 匹配命名组中的 1+ 个非冒号字符param
  • :\s*: 匹配 a:后跟 0+ 个空格字符
  • (?P<desc>.*?): 匹配命名组中任何字符的 0+desc
  • \s*: 匹配 0+ 个空格字符
  • (?:\[(?P<value>[^]]*)\])?:可选地匹配[...]和捕获命名组中的内部文本value
  • \s*: 数学 0+ 空白字符
  • (?:\{(?P<group>[^}]*)\})?:可选地匹配{...}和捕获命名组中的内部文本group
  • $: 结尾

推荐阅读