我花了一个小时试图找出神奇的语法来解决Python中的以下问题''包。我暂时已经破解了它,但是想要提出挑战:
以下字符串代表我们的测试:
*Structure song <!-- See Project:Project_Songs -->
*Structure song |
*Structure song title |
目的是提取“歌曲”,“歌曲”和“歌曲标题”。从这些只有一个正则表达式。
我的尝试:
r'\*Structure ([^\|]*)(?:<)?'
到目前为止,我还没有尝试过各种各样的组合。我的解决方法添加了&符号&amp;&#39;在捕获括号中的排除集。但是,我并不认为提取的字符串不能包含&#39;&#39;
答案 0 :(得分:2)
我使用与Dmitriy相似的模式,但更加线性:
\*Structure\s(.*?)(?=\s(?:<|\|))
请参阅regex demo。
<强>解释强>:
\*Structure
- 文字子串*Structure
\s
- 一个空格(替换为[ \t]
仅匹配普通空格或制表符,如果您只需要匹配空格,则仅使用空格)(.*?)
- 第1组捕获除换行符以外的0 +字符,尽可能少到第一个... (?=\s(?:<|\|))
- (前瞻性要求)
\s
- 一个空格跟着......
<
- 子字符串<
|
- 或...... \|
- 文字管道符号。更快的同义替代(因为它基于unroll-the-loop原则)正则表达式看起来像
\*Structure\s(\S*(?:\s(?!<|\|)\S*)*)
请参阅this demo
它是相同的正则表达式,但以最线性的方式编写。
答案 1 :(得分:1)
我建议使用非贪婪的&#34;任何东西&#34;其次是&#34;&amp; lt;&#34;或管道char表示为lookahead:
\*Structure (.*?(?= <)|.*?(?= \|))