如何在Python的正则表达式中省略中间的词?
我有一个多行字符串,内容像这样:
"...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]
则是匹配字符 T
、o
或 g
中的任意一个。即使是 [^Togo]
也不行,因为它只匹配不是 T
、o
或 g
的任何字符。