Python 例如「;在负变长lookbehinds中使用\G来限制lookbehind的返回距离";

Python 例如「;在负变长lookbehinds中使用\G来限制lookbehind的返回距离";,python,regex,Python,Regex,在awesome regex模块()的pypi页面中,声明\G可以“在负变长lookbehind中使用,以限制lookbehind的回溯距离”。非常有趣,但页面上没有给出任何例子,当我试图想象一个例子时,我的白带regex-fu简直窒息了 有人能描述一些示例用例吗?我能想到的一个例子是在正向回溯中使用\G以逗号分隔CSV行: regex.split(r'(?<=\G(?:"[^"]*(?:""[^"]*)*"|[^"]*)),', csv) regex.split(r'(?以下是一个创造

在awesome regex模块()的pypi页面中,声明\G可以“在负变长lookbehind中使用,以限制lookbehind的回溯距离”。非常有趣,但页面上没有给出任何例子,当我试图想象一个例子时,我的白带regex-fu简直窒息了


有人能描述一些示例用例吗?

我能想到的一个例子是在正向回溯中使用
\G
以逗号分隔CSV行:

regex.split(r'(?<=\G(?:"[^"]*(?:""[^"]*)*"|[^"]*)),', csv)

regex.split(r'(?以下是一个创造性地使用
\G
和反向查找的示例:

regex.match(r'\b\w+\b(?:\s(\w+\b)(?<!\G.*\b\1\b.*\b\1\b))*', words)
regex.match(r'\b\w+\b(?:\s(\w+\b)(?\G
) 模式末尾的lookback限制在
\G
可以在当前匹配上断言另一个条件,否则这是不可能的。基本上,模式是一个变体,但不限于整个字符串

这是一个在.Net中的应用程序,它具有相同的功能。

在Python2中使用
findall
regex
模块尝试相同的模式会导致分段错误,但是
match
似乎有效。

这是一个可能比创造性更有用的示例。
它使用从最后一个匹配开始的可变长度负查找(
\G

向前检查到当前位置

在这种情况下,
(?),结果是它匹配字符串中的每一个
b
,其中b由一个或多个
a
分隔

这也可以在固定宽度的查找中完成,如
(?结果是它与字符串中的每一个
b
相匹配,其中b被一个
a
分隔

这是一种模板,其中
a
b
可以是更大的表达式,并且有更多的
意思

(需要注意的一件事是,在负回溯中使用
\G
时,很容易
满足否定的断言。所以,这些东西都写满了
gotcha

没有Python(最新版本,beta?)来测试这一点,所以下面使用的是C#控制台应用程序

string strSrc = "abaabaabaabaabaab";
Regex rxGtest = new Regex(@"(?<!\Ga+)b");
Match _m = rxGtest.Match(strSrc);
while (_m.Success)
{
    Console.WriteLine("Found: {0} at position {1}", _m.Groups[0].Value, _m.Index);
    _m = _m.NextMatch();
}

我想它是指
(?)或类似的东西。好吧,忍者编辑,但它是有点相同的概念…尽管我想不出任何用于此的用例。我仍然想知道为什么文档会明确地说“负面回顾”,而不是简单地回顾
(?负面回顾
(?@sln老实说,过去几天我很忙,所以我没法花时间思考这个问题的解决方案/示例。因为这个问题“没有引起足够的注意”,我已经悬赏了。对我来说没有崩溃(Python 3.4.1),但
findall
返回
[,,,,,,,,,,,,,,,,,,]
这似乎没有什么用处。
match
确实返回了
这很简洁!-)我认为使用
\G
位置的lookback在第一个子表达式时起作用。我认为它作为最后一个子表达式不可行(在右侧)是的,你是对的,它只检查到当前的匹配位置。我有点困惑,认为它是开放式的,只是一个注释。拆分正则表达式只验证下一个逗号在dbl引号之外。我不验证剩余引号的均匀性。第二个正则表达式(和链接)是一种非常糟糕的验证方式(如你所说)因为它类似于一个N-阶乘开销。如果需要验证,可以每行执行一次,然后在其上使用一个普通字段正则表达式,避免完全拆分。已进行基准测试和讨论->。
[^”]*(?:“[^”]*)*
可以写成
(?:[^”]|)*
。根据引擎的不同,它可以成为所有格。@nhahdh-你说得对。我没有过多考虑就同意了。
(?:[^“]|?”)*+
在这里可以很好地工作。
Found: b at position 4
Found: b at position 10
Found: b at position 16