python - 带有可选组的 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>.*)\})?$
仅当根据模式预期有空格时,我才会得到有效的结果。
知道如何解决这个问题吗?
解决方案
您可以使用此正则表达式来解析您的问题中提到的所有可能的组合:
^: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
$
: 结尾
推荐阅读
- python - 号码流检测
- unity3d - 在 Unity3d 中扭曲或收缩纹理的特定区域的着色器
- networking - PPP 和以太网接口不能同时工作
- json - Angular:json 到 formBuilder 到 json
- ios - 如何解决建筑的重复符号
- python - 将列表直接写入 gcs 文件
- postgresql - 不同模式之间的 Postgres 表同步
- javascript - 我收到“无法读取未定义的属性‘办公室’”下拉列表错误
- sql - 返回正确的内容搜索字典中的子字符串 - Postgresql
- graph-theory - 如何使用 MiniZinc 将图划分为连接的组件?