我有一个字符串s1,我想找到所有以ABC开头并以BCD结尾的匹配字符串:
这是我尝试过的,它将返回 ['ABCDDDCECCCBCDABCVVVBCD']
但我想要的是:ABCDDDCECCCBCD, ABCVVVBCD
实际上有两个匹配字符串序列
我怎样才能实现这个目标?
谢谢!!
s1='AABCDDDCECCCBCDABCVVVBCD'
t1 ='ABC.*BCD'
t2 = 'ABC.*CEC'
我想获取所有符合从ABD开始、以BCD结束、从ABC开始、以CEC开始的条件的字符串。
因此预期结果是 ABCDDDCEC, ABCVVVBCD
它不应该返回 ABCDDDCECCCBCD
最佳答案
您的正则表达式中有两个问题。
- 你有
.*
,它会贪婪地捕获所有内容,并会尽可能多地捕获ABCsomethingBCD
的任何序列 - 您有
$
字符串结尾 anchor ,它强制字符串匹配到行尾。
您可以使用此正则表达式,其中匹配从 ABC
开始,然后通过非贪婪正则表达式 .*?
捕获尽可能少的内容,然后匹配 BCD
并且由于没有 $
字符,因此不会强制匹配到行尾。请注意,即使您将 .*
更改为 .*?
并且不从正则表达式中删除 $
,您仍然只会得到一个匹配项直到行尾,这是因为 .*?
被强制匹配到行尾,因为正则表达式中存在 $
字符。修复此问题可使行为达到预期。
ABC.*?BCD
Python 演示,
import re
s1='AABCDDDCECCCBCDABCVVVBCD'
t1 ='ABC.*?BCD'
re.findall(t1,s1)
打印,
['ABCDDDCECCCBCD', 'ABCVVVBCD']
如果您的字符串是 AABCDDDCECCCABCVVVBCD
并且您不想匹配字符串中的第二个 ABC
直到 BCD
,您可以使用这个 tempered greedy token 基于正则表达式,
ABC(?:(?!ABC).)*BCD
<强> Regex Demo
编辑 2:
对于给定的字符串 AABCDDDCECCCABCVVVBCD
,您希望根据帖子编辑获得这两个匹配项,
ABCDDDCEC and ABCVVVBCD
您可以使用此正则表达式,
ABC.*?(?:CEC|BCD)
<强> Regex Demo
关于python - 如何使用正则表达式遍历字符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55926220/