python - 正则表达式通过分隔符捕获可选组
问题描述
我需要通过引用文本和@作者和#类别分隔符来解析字符串引用。作者和类别按顺序排列,但是是可选的。像这样:
"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 时才起作用。试图使后面的组成为可选的,这对我来说很糟糕:
^(.*?)(@.*)?(#.*)?$
如何正确捕获它们?
解决方案
假设@
and#
只出现在 author 或 category 前面的字符串末尾,可以使用
^([^@#]*)(@[^#]*)?(#.*)?$
查看正则表达式演示,模式匹配
^
- 字符串的开始([^@#]*)
#
- 第 1 组:除and之外的任何零个或多个字符@
(@[^#]*)?
- 第 2 组(可选):@
然后是零个或多个字符,而不是#
(#.*)?
- 第 3 组(可选):#
然后是零个或多个字符,而不是#
$
- 字符串结束。