Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/300.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_Python 3.x_Regex Lookarounds - Fatal编程技术网

Python 需要使用正则表达式查找的提示

Python 需要使用正则表达式查找的提示,python,regex,python-3.x,regex-lookarounds,Python,Regex,Python 3.x,Regex Lookarounds,假设有一个序列…a…b…a…b…c,其中a、b和c是字符串常量。点表示a、b和c之间的任意数量的其他符号(不是a、b或c) 我想将“a…b…c”匹配为最懒的方式(最后一个a-b-c三元组),但regexp引擎抓住了更大的“a…b…a…b…c”并更进一步 我尝试以a\w+b\w+(?!a)\w+c或a\w+b\w+(?!a)\w+?c等形式使用消极的前瞻,但迄今为止没有成功。没有必要使用looakarounds。将*放在regexp的开头,并将要匹配的内容放入捕获组: .*(a.*b.*c) 然

假设有一个序列…a…b…a…b…c,其中a、b和c是字符串常量。点表示a、b和c之间的任意数量的其他符号(不是a、b或c)

我想将“a…b…c”匹配为最懒的方式(最后一个a-b-c三元组),但regexp引擎抓住了更大的“a…b…a…b…c”并更进一步


我尝试以
a\w+b\w+(?!a)\w+c
a\w+b\w+(?!a)\w+?c
等形式使用消极的前瞻,但迄今为止没有成功。

没有必要使用looakarounds。将
*
放在regexp的开头,并将要匹配的内容放入捕获组:

.*(a.*b.*c)
然后使用
.group(1)
获取捕获组的内容

开始时贪婪的
*
使其查找最后一个三元组

您需要在这三个部分之间使用

想象一下
a
abc
b
bff
c
cca
。然后,你会使用

(?s)abc(?:(?!abc).)*?bff(?:(?!abc).)*?cca

详细信息

  • (?s)
    -与
    re.s
    re.DOTALL
    修饰符相同,使
    匹配换行符
  • abc
    -文本字符串
    abc
    或某种模式#1
  • (?:(?!abc)。*?
    -除换行符以外的任何不启动
    abc
    序列的0+字符,尽可能少
  • bff
    -文本字符串
    bff
    或某种模式#2
  • (?:(?!abc)。*?
    -见上文
  • cca
    -文本字符串
    cca
    或某种模式#3

a
b
c
多字符字符串吗?是的,它们是多字符常量字符串。
a(?(!a | b | c)*b(?(!a | b | c)是唯一的方法@sln:至少有两种方法。如果使用惰性量词,则不需要每个TGT中的最后一个分支。我注意到这通常会在某种程度上加快匹配速度。@WiktorStribiżew-你没有读过这个问题<代码>(不是a、b或c)a、b和c之间的符号
。只有一种方法可以做到这一点。我不知道TGT是什么,也不知道你一般在说什么。不,OP不需要最后一次出现,但它们都需要。@WiktorStribiż。否则就没有必要使用lookaheads。@WiktorStribiżew“一般情况”是什么?这个问题只描述了一个案例。我认为不需要长相。Wiktor,谢谢你的解决方案-它很好用!是的,我需要捕捉多个匹配项(实际上您的示例已经很好地捕捉到了多个匹配项)。而且我还有换行符作为我的“点”,所以我把你的工作修改为
abc(?(?!abc)[\S\S])*?bff(?(?!abc | bff)[\S\S])*?cca
,所以它在字符串常量之间使用换行符。要使
匹配换行符,你需要传递一个点球修饰符-
(?!S)abc(?(?!abc.)*?)*?bff(?(!abc |)*?cca
BTW我认为一个“bff”的替代方案是多余的(可以删除)。嗯……似乎即使是这个
abc(?(?!abc)[\S\S])*?bff[\S\S]*?cca
@einy它取决于输入字符串。看见我更愿意在
cca
之前保留
(?:(?!abc)。*