Python 带有捕获括号和非贪婪匹配约束的正则表达式
我刚刚花了一个小时试图找出神奇的语法,用're'包解决Python中的以下问题。目前我已经对其进行了研究,但我想提出挑战: 以下字符串代表我们的测试:Python 带有捕获括号和非贪婪匹配约束的正则表达式,python,regex,Python,Regex,我刚刚花了一个小时试图找出神奇的语法,用're'包解决Python中的以下问题。目前我已经对其进行了研究,但我想提出挑战: 以下字符串代表我们的测试: *Structure song <!-- See Project:Project_Songs --> *Structure song | *Structure song title | 目标是用一个正则表达式从中提取“歌曲”、“歌曲”和“歌曲标题” 我的尝试: r'\*Structure ([^\|]*)(?:&am
*Structure song <!-- See Project:Project_Songs -->
*Structure song |
*Structure song title |
目标是用一个正则表达式从中提取“歌曲”、“歌曲”和“歌曲标题”
我的尝试:
r'\*Structure ([^\|]*)(?:<)?'
到目前为止,我尝试过各种组合,我不会让你感到厌烦。我的解决方法是在捕获括号中的排除集中添加符号“&”。但是,我不想假设提取的字符串不能包含“&”。我建议使用非贪婪的“anything”后跟“”或表示为lookahead的管道字符:
\*Structure (.*?(?= <)|.*?(?= \|))
演示:我建议使用非贪婪的“anything”,后跟“”或表示为lookahead的管道字符:
\*Structure (.*?(?= <)|.*?(?= \|))
演示:我会使用与Dmitry相似的模式,但更线性的模式:
\*Structure\s(.*?)(?=\s(?:<|\|))
看
说明:
-文字子字符串\*结构
*结构
-空白(替换为\s
以仅匹配普通空格或制表符,或者如果只需要匹配空格,则替换为仅空格)[\t]
-第1组捕获0多个字符(换行除外),尽可能少到第一个字符(.*)
-(正向前瞻)(?=\s(?:\\\\)
-一个空格,后跟。。。\s
-子字符串
-或李>|
-文字管道符号\\\124;
\*Structure\s(\S*(?:\s(?!<|\|)\S*)*)
看
它是相同的正则表达式,但以最线性的方式编写。我会使用与Dmitry相似的模式,但更线性:
\*Structure\s(.*?)(?=\s(?:<|\|))
看
说明:
-文字子字符串\*结构
*结构
-空白(替换为\s
以仅匹配普通空格或制表符,或者如果只需要匹配空格,则替换为仅空格)[\t]
-第1组捕获0多个字符(换行除外),尽可能少到第一个字符(.*)
-(正向前瞻)(?=\s(?:\\\\)
-一个空格,后跟。。。\s
-子字符串
-或李>|
-文字管道符号\\\124;
\*Structure\s(\S*(?:\s(?!<|\|)\S*)*)
看
这是相同的正则表达式,但用最线性的方式写。
更确切地说,你认为你的匹配的尾部边界是什么?“title”模式和你想要省略的其他东西有什么显著的区别?而不是写复杂的正则表达式,为什么不简单地说呢?一种方法是使用否定的前瞻性。代码>重新编译(r'\*结构((?:[^\\|](?!)+)),尽管这将在
案例中添加一个空格。似乎比Dmitry的正则表达式稍微快一点。我想提取帖子中提到的字符串:“song”和“song title”。我当然可以取消对字符串的扫描,但我正在处理一个多TB的文件,对字符串进行额外扫描似乎比纯正则表达式解决方案更糟糕,你认为你的匹配的尾随边界是什么?“title”模式和你想省略的其他东西有什么显著的区别?而不是编写复杂的正则表达式,为什么不简单地说呢?一种方法是使用否定的前瞻性。代码>重新编译(r'\*结构((?:[^\\|](?!)+)),尽管这将在
案例中添加一个空格。似乎比Dmitry的正则表达式稍微快一点。我想提取帖子中提到的字符串:“song”和“song title”。我当然可以取消对字符串的扫描,但我正在处理一个多TB的文件,对字符串进行额外扫描似乎比纯正则表达式解决方案更糟糕。谢谢,但是如果您在所需字符串后面有“|”,它仍然会断开。谢谢,但是如果您有“|”,它仍然会断开遵循所需的字符串。180个步骤(正则表达式1)与98个步骤(正则表达式2)。我会在生产中使用正则表达式2。是的,这就是我想要的。我只更新了允许可变数量的空格,因为它们不是固定的。好吧,如果总是至少有一个空格,你只需要添加一个量词:\*Structure\s+(*?)(=\s+(?:\ \ \)
或\*Structure\s+(\s+)(\s+(?!\ \ \ \ \ \s+)*)
。此外,为了防止有多行输入,您需要使用常规空格,而不是\s
@boardrider:如果歌曲有&
符号,则需要使用。180步(Regex 1)与98步(Regex 2)。我会在生产中使用正则表达式2。是的,这就是我想要的。我只更新了允许可变数量的空格,因为它们不是固定的。好吧,如果总是至少有一个空格,你只需要添加一个量词:\*Structure\s+(*?)(=\s+(?:\ \ \)
或\*Structure\s+(\s+)(\s+(?!\ \ \ \ \ \s+)*)
。此外,如果您有多行输入,则需要使用常规空格,而不是\s
@boardrider:如果歌曲有&
符号,则需要使用空格。