Python 如何使用正则表达式遍历字符?

Python 如何使用正则表达式遍历字符?,python,regex,Python,Regex,我有一个字符串s1,我想找到所有以ABC开头,以BCD结尾的匹配字符串: 这是我尝试过的,它将返回['abcdddceccbcdabccvvvbcd'] 但是我想要的是:abcdddceccbcd,ABCVVVBCD实际上有两个匹配的字符串序列 我怎样才能做到这一点? 谢谢 s1='AABCDDDCECCCBCDABCVVVBCD' t1 ='ABC.*BCD' t2 = 'ABC.*CEC' 我想得到所有符合条件的字符串,即从ABD开始,在BCD中结束,从ABC开始,在

我有一个字符串s1,我想找到所有以ABC开头,以BCD结尾的匹配字符串: 这是我尝试过的,它将返回
['abcdddceccbcdabccvvvbcd']

但是我想要的是:
abcdddceccbcd,ABCVVVBCD
实际上有两个匹配的字符串序列 我怎样才能做到这一点? 谢谢

   s1='AABCDDDCECCCBCDABCVVVBCD'
    t1 ='ABC.*BCD'
    t2 = 'ABC.*CEC'
我想得到所有符合条件的字符串,即从ABD开始,在BCD中结束,从ABC开始,在CEC中结束。
因此,预期结果是
ABCDDDCEC,ABCVVVBCD
它不应该返回abcdddceccbcd

正则表达式中有两个问题

  • 你有一个
    *
    ,它贪婪地捕获一切,并将尽可能多地捕获,这将耗尽
    ABCsomethingBCD
  • 您有
    $
    字符串结束锚点,它强制字符串匹配到行结束
您可以使用这个正则表达式,其中匹配从
ABC
开始,然后通过非贪婪的正则表达式
*?
捕获尽可能少的内容,然后匹配
BCD
,并且由于没有
$
字符,所以在行尾之前不会强制匹配。注意,即使您将
*
更改为
*?
并且不从正则表达式中删除
$
,您仍然只能得到一个匹配,直到行尾,这是因为
*?
被强制匹配到行尾,因为正则表达式中存在
$
字符。修复该问题会使行为符合预期

ABC.*?BCD
Python演示

import re

s1='AABCDDDCECCCBCDABCVVVBCD'
t1 ='ABC.*?BCD'
re.findall(t1,s1)
印刷品

['ABCDDDCECCCBCD', 'ABCVVVBCD']
如果字符串是
AABCDDDCECCCABCVVVBCD
,并且在
BCD
之前不想匹配字符串中的第二个
ABC
,则可以使用基于此的正则表达式

ABC(?:(?!ABC).)*BCD

编辑2: 对于给定字符串
AABCDDDCECCCABCVVVBCD
,您希望根据后期编辑获得这两个匹配项

ABCDDDCEC and ABCVVVBCD
你可以用这个正则表达式

ABC.*?(?:CEC|BCD)

正则表达式将尝试匹配尽可能多的字符,直到字符串
*
结束。这是整个字符串,除了第一个字符。谢谢!我的字符串是s1='AABCDDDCECCCABCVVVBCD',然后它将从第一次出现的
ABC
开始,恰好是从第二个字符开始,并将匹配到行尾,因为
BCD
仅出现在末尾。是否要将第二个
ABC
匹配到最后一个
BCD
而不是第一个?如果你需要的话,我可以很容易做到。是的,请。例如,如果有其他情况需要查找ABC.*CEC,我如何获取ABCDDDCEC,然后继续搜索ABCVVVBCD。这意味着它必须从ABC开始,但如果它在CEC或BCD的末尾匹配,它将返回该值,并继续搜索下一个匹配值。我感觉您需要重叠匹配。是这样吗?你能给我看一个字符串并从中列出预期的匹配项吗?我找到了你的匹配项。用正则表达式更新我的答案。请稍等:)