Python 需要使用正则表达式查找的提示
假设有一个序列…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”并更进一步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\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
或某种模式#1abc
-除换行符以外的任何不启动(?:(?!abc)。*?
序列的0+字符,尽可能少abc
-文本字符串bff
或某种模式#2bff
-见上文(?:(?!abc)。*?
-文本字符串cca
或某种模式#3cca
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)。*
。