在开始和结束时具有相同的组时发生冲突

时间:2019-05-08 04:39:34

标签: python regex pcre

我有一个应该捕获的正则表达式:

[=foo]
[="foo"]
[='foo']

开始和结尾必须相同,所以我要捕获引号并以\ 1结尾。它用来不加引号的问号:

\[=(['\"]?)(.+)\1\]

如果我在一行上尝试可以正常工作,但是当我尝试编写其他任何内容并调用闭包括号时,它将一直匹配到该括号。行为的一些示例:https://regex101.com/r/4qYzyS/1

有人解决吗?要匹配我想要的3种模式而没有冲突?谢谢。

4 个答案:

答案 0 :(得分:2)

将点设为非贪婪,即使用(.+?)。另外,您可能要关闭第二个捕获组,或者可能只是将其完全删除。例如。以下模式似乎有效:

\[=([\"']?).+?\1\]

Demo

这是一个示例Python脚本:

input = "[=\"foo\"]\n[=\"Lorem ipsum\"]\n\n[=foo]Lorem ipsum]";
for match in re.finditer(r"\[=([\"']?).+?\1\]", input):
    print match.group(0)

[="foo"]
[="Lorem ipsum"]
[=foo]

答案 1 :(得分:2)

您可以使用以下表达式简单地做到这一点:

(\[=)(.+)(\])

Demo

enter image description here

如果您想添加边界而不是使用(.+),则可能要使用表达式并添加[]之间的任何可能的字符,也许是similar to

(\[=)([A-z\s\x22]+)(\])

enter image description here

此图显示了第二个表达式的工作方式,您可以在此link中可视化其他表达式:

enter image description here

代码

此代码显示了表达式在Python中的工作方式:

# -*- coding: UTF-8 -*-
import re

string = "[=foo]Lorem ipsum] with anything else that you wish"
expression = r'((\[=)([A-z\s\x22]+)(\]))'
match = re.search(expression, string)
if match:
    print("YAAAY! \"" + match.group(1) + "\" is a match  ")
else: 
    print(' Sorry! No matches! Something is not right! Call 911 ')

输出

YAAAY! "[=foo]Lorem ipsum]" is a match 

性能测试

此JavaScript代码段使用简单的100万次for循环来显示表达式的性能。

repeat = 1000000;
start = Date.now();

for (var i = repeat; i >= 0; i--) {
	var string = "[=foo]Lorem ipsum] with anything else that you wish";
	var regex = /((\[=)([A-z\s\x22]+)(\]))(.*)/g;
	var match = string.replace(regex, "$1");
}

end = Date.now() - start;
console.log("YAAAY! \"" + match + "\" is a match  ");
console.log(end / 1000 + " is the runtime of " + repeat + " times benchmark test.  ");

答案 2 :(得分:1)

如果将(.+)设置为非(.+?),则可以避免将其余的字符串混为一谈:

\[=([\"']?)(.+?)\1\]/
              ^

答案 3 :(得分:1)

您的正则表达式工作正常,其与第二行匹配的原因是,您已启用DOTALL模式,因为.也与换行符匹配。只需取消选中DOTALL模式即可禁用s模式,您将获得预期的结果。

Regex Demo after disabling DOTALL mode

enter image description here

此外,在第三个示例中,我不确定您是否希望正则表达式完全匹配,但是如果您只想匹配[=foo]而不匹配[=foo]Lorem ipsum],那么您会应该在正则表达式中使用[^[\]]+而不是.+

另外,由于字符串似乎被"'包围,或者双方都没有,所以您似乎想匹配它,因此您还应该包括"和{ {1}}在否定的字符类中,因此您的正则表达式不应与像'这样的输入匹配。总的来说,您应该使用的正确正则表达式是这个

Regex that you should be using precisely