如何在Python的正则表达式中省略中间的词?

0 投票
3 回答
2485 浏览
提问于 2025-04-15 14:24

我有一个多行字符串,内容像这样:

"...Togo...Togo...Togo...ACTIVE..."

我想提取第三个'Togo'和'ACTIVE'之间的所有内容,以及字符串的剩余部分。但是我找不到合适的正则表达式来做到这一点。如果我尝试类似下面的写法:

reg = "(Togo^[Togo]*?)(ACTIVE.*)"

但是什么都没有被捕获(最外面的括号是用来捕获内容的)。

3 个回答

1
"(Togo(?:(?!Togo).)*)(ACTIVE.*)"

在你的正则表达式中,方括号表示一个字符类,它可以匹配字符 'T'、'o' 或 'g' 中的任意一个。插入符号('^')在字符类外面时表示输入的开始,而如果放在方括号里面,则是用来反转字符类,也就是说匹配不在这个字符类中的字符。

在我的正则表达式中,匹配完单词 "Togo" 后,我会一个字符一个字符地继续匹配,但在这之前我会先检查一下,确保这不是另一个 "Togo" 的开始。(?!Togo) 这个部分叫做 负向前瞻

1
reg = "Togo.*Togo.*Togo(.*)ACTIVE"
reg = "Togo(([^T]|T[^o]|To[^g]|Tog[^o])*T?.?.?)ACTIVE"

另外,如果你想找到最后一次出现的“Togo”和接下来出现的“ACTIVE”之间的字符串,而“Togo”出现的次数不一定是三次,可以试试这个方法:

1

这段内容只匹配我们想要的部分:

.*(Togo.*?)(ACTIVE.*)

开头的 .* 是贪婪的,所以后面的 Togo 会在最后一个可能的位置匹配。被捕获的部分是从最后一个 Togo 开始的。

在你的表达式 ^[Togo]*? 中,结果并不正确。^ 是用来匹配行的开头,而 [Togo] 则是匹配字符 Tog 中的任意一个。即使是 [^Togo] 也不行,因为它只匹配不是 Tog 的任何字符。

撰写回答