Python 如何使用正则表达式遍历字符?
我有一个字符串s1,我想找到所有以ABC开头,以BCD结尾的匹配字符串: 这是我尝试过的,它将返回Python 如何使用正则表达式遍历字符?,python,regex,Python,Regex,我有一个字符串s1,我想找到所有以ABC开头,以BCD结尾的匹配字符串: 这是我尝试过的,它将返回['abcdddceccbcdabccvvvbcd'] 但是我想要的是:abcdddceccbcd,ABCVVVBCD实际上有两个匹配的字符串序列 我怎样才能做到这一点? 谢谢 s1='AABCDDDCECCCBCDABCVVVBCD' t1 ='ABC.*BCD' t2 = 'ABC.*CEC' 我想得到所有符合条件的字符串,即从ABD开始,在BCD中结束,从ABC开始,在
['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的末尾匹配,它将返回该值,并继续搜索下一个匹配值。我感觉您需要重叠匹配。是这样吗?你能给我看一个字符串并从中列出预期的匹配项吗?我找到了你的匹配项。用正则表达式更新我的答案。请稍等:)