Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 带有捕获括号和非贪婪匹配约束的正则表达式_Python_Regex - Fatal编程技术网

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

Python 带有捕获括号和非贪婪匹配约束的正则表达式,python,regex,Python,Regex,我刚刚花了一个小时试图找出神奇的语法,用're'包解决Python中的以下问题。目前我已经对其进行了研究,但我想提出挑战: 以下字符串代表我们的测试: *Structure song <!-- See Project:Project_Songs --> *Structure song | *Structure song title | 目标是用一个正则表达式从中提取“歌曲”、“歌曲”和“歌曲标题” 我的尝试: r'\*Structure ([^\|]*)(?:&am

我刚刚花了一个小时试图找出神奇的语法,用're'包解决Python中的以下问题。目前我已经对其进行了研究,但我想提出挑战:

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

*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;
        -文字管道符号
一个更快的同义替代方法(因为它基于展开循环原则)regex如下所示

\*Structure\s(\S*(?:\s(?!<|\|)\S*)*)


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

我会使用与Dmitry相似的模式,但更线性:

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

说明

  • \*结构
    -文字子字符串
    *结构
  • \s
    -空白(替换为
    [\t]
    以仅匹配普通空格或制表符,或者如果只需要匹配空格,则替换为仅空格)
  • (.*)
    -第1组捕获0多个字符(换行除外),尽可能少到第一个字符
  • (?=\s(?:\\\\)
    -(正向前瞻)
    • \s
      -一个空格,后跟。。。
      • -子字符串
      • |
        -或
      • \\\124;
        -文字管道符号
一个更快的同义替代方法(因为它基于展开循环原则)regex如下所示

\*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:如果歌曲有
&
符号,则需要使用空格。