我有一个字符串s1,我想找到所有以ABC开头并以BCD结尾的匹配字符串:
这是我尝试过的,它将返回['ABCDDDCECCCBCDABCVVVBCD']
但是我想要的是:ABCDDDCECCCBCD, ABCVVVBCD
实际上有两个匹配的字符串序列
我该如何实现?
谢谢!
s1='AABCDDDCECCCBCDABCVVVBCD'
t1 ='ABC.*BCD'
t2 = 'ABC.*CEC'
我想获取所有与BCD中从ABD结束,从ABC和CEC开始的条件匹配的字符串。
因此,预期结果是ABCDDDCEC, ABCVVVBCD
,它不应返回ABCDDDCECCCBCD
答案 0 :(得分:3)
您的正则表达式有两个问题。
.*
,它可以贪婪地捕获所有内容,并且将尽其所能,耗尽所有ABCsomethingBCD
的序列$
字符串锚点的末尾,它强制字符串匹配到行尾。您可以使用此正则表达式,其中匹配从ABC
开始,然后由非贪婪正则表达式.*?
捕获,然后匹配BCD
,因为没有{{1 }}字符直到行尾都不会被强制匹配。请注意,即使您将$
更改为.*
并且不从正则表达式中删除.*?
,您仍然只会得到一个匹配项,直到行尾为止,这是因为$
由于正则表达式中存在.*?
个字符,因此被迫匹配到行尾。该修复程序可以使行为达到预期的效果。
$
Python演示
ABC.*?BCD
打印
import re
s1='AABCDDDCECCCBCDABCVVVBCD'
t1 ='ABC.*?BCD'
re.findall(t1,s1)
如果您的字符串是['ABCDDDCECCCBCD', 'ABCVVVBCD']
,并且您不希望匹配字符串中的第二个AABCDDDCECCCABCVVVBCD
,直到ABC
,则可以使用此 {{3} } 基于正则表达式,
BCD
修改2:
对于给定的字符串ABC(?:(?!ABC).)*BCD
,您希望根据帖子编辑获得这两个匹配项,
AABCDDDCECCCABCVVVBCD
您可以使用此正则表达式,
ABCDDDCEC and ABCVVVBCD