首页 > 解决方案 > 正则表达式通过分隔符捕获可选组

问题描述

我需要通过引用文本和@作者和#类别分隔符来解析字符串引用。作者和类别按顺序排列,但是是可选的。像这样:

"When in doubt - don’t. @Ben Franklin #decisions"

{'text': 'When in doubt - don’t.', 'author': 'Ben Franklin', 'category': 'decisions'}

"When in doubt - don’t. #decisions"

{'text': 'When in doubt - don’t.', 'category': 'decisions'}

"When in doubt - don’t. @Ben Franklin"

{'text': 'When in doubt - don’t.', 'author': 'Ben Franklin'}

如果分隔符和空格粘在捕获的组上也没关系,我可以稍后将它们剥离。我目前的正则表达式:

^(.*?)(@.*)(#.*)$

仅当输入字符串中同时存在 @author 和 #category 时才起作用。试图使后面的组成为可选的,这对我来说很糟糕:

^(.*?)(@.*)?(#.*)?$

如何正确捕获它们?

标签: pythonregexre

解决方案


假设@and#只出现在 author 或 category 前面的字符串末尾,可以使用

^([^@#]*)(@[^#]*)?(#.*)?$

查看正则表达式演示,模式匹配

  • ^- 字符串的开始
  • ([^@#]*)#- 第 1 组:除and之外的任何零个或多个字符@
  • (@[^#]*)?- 第 2 组(可选):@然后是零个或多个字符,而不是#
  • (#.*)?- 第 3 组(可选):#然后是零个或多个字符,而不是#
  • $- 字符串结束。

推荐阅读