具有捕获括号和非贪婪匹配约束的正则表达式

时间:2016-07-18 20:35:44

标签: python regex

我花了一个小时试图找出神奇的语法来解决Python中的以下问题''包。我暂时已经破解了它,但是想要提出挑战:

以下字符串代表我们的测试:

*Structure song <!-- See Project:Project_Songs -->
*Structure song |
*Structure song title |

目的是提取“歌曲”,“歌曲”和“歌曲标题”。从这些只有一个正则表达式。

我的尝试:

r'\*Structure ([^\|]*)(?:<)?'

到目前为止,我还没有尝试过各种各样的组合。我的解决方法添加了&符号&'在捕获括号中的排除集。但是,我并不认为提取的字符串不能包含''

2 个答案:

答案 0 :(得分:2)

我使用与Dmitriy相似的模式,但更加线性:

\*Structure\s(.*?)(?=\s(?:<|\|))

请参阅regex demo

<强>解释

  • \*Structure - 文字子串*Structure
  • \s - 一个空格(替换为[ \t]仅匹配普通空格或制表符,如果您只需要匹配空格,则仅使用空格)
  • (.*?) - 第1组捕获除换行符以外的0 +字符,尽可能少到第一个...
  • (?=\s(?:&lt;|\|)) - (前瞻性要求)
    • \s - 一个空格跟着......
      • &lt; - 子字符串&lt;
      • | - 或......
      • \| - 文字管道符号。

更快的同义替代(因为它基于unroll-the-loop原则)正则表达式看起来像

\*Structure\s(\S*(?:\s(?!&lt;|\|)\S*)*)

请参阅this demo

它是相同的正则表达式,但以最线性的方式编写。

答案 1 :(得分:1)

我建议使用非贪婪的&#34;任何东西&#34;其次是&#34;&amp; lt;&#34;或管道char表示为lookahead:

\*Structure (.*?(?= &lt;)|.*?(?= \|))

演示:https://regex101.com/r/rT3oV5/2