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

时间:2019-04-30 17:43:57

标签: python regex

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

但是我想要的是:ABCDDDCECCCBCD, ABCVVVBCD实际上有两个匹配的字符串序列 我该如何实现? 谢谢!

   s1='AABCDDDCECCCBCDABCVVVBCD'
    t1 ='ABC.*BCD'
    t2 = 'ABC.*CEC'

我想获取所有与BCD中从ABD结束,从ABC和CEC开始的条件匹配的字符串。 因此,预期结果是ABCDDDCEC, ABCVVVBCD,它不应返回ABCDDDCECCCBCD

1 个答案:

答案 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

tempered greedy token

修改2: 对于给定的字符串ABC(?:(?!ABC).)*BCD ,您希望根据帖子编辑获得这两个匹配项,

AABCDDDCECCCABCVVVBCD

您可以使用此正则表达式,

ABCDDDCEC and ABCVVVBCD

Regex Demo