带fall-through的重复正则表达式

2024-09-30 00:33:31 发布

您现在位置:Python中文网/ 问答频道 /正文

假设你有这个字符串:'catdogfoxcat'

我可以使用以下正则表达式轻松地将其拆分: re.compile('(dog)|(cat)|(fox)').findall(the_string)

在python中,结果是:

[('', 'cat', ''),
 ('dog', '', ''),
 ('', '', 'fox'),
 ('dog', '', ''),
 ('dog', '', ''),
 ('', '', 'fox'),
 ('', 'cat', '')]

太完美了

现在让我们将该字符串改为:“catdogaaadoggdogbcat”

如果第三个regex项是任意的(aaa/bbb/随便什么),我想不出怎么做。我想要这样的东西:re.compile('(dog)|(cat)|(.*?)').findall(the_string)

目前我得到以下结果,这是没有意义的

[('', 'cat', ''),
 ('dog', '', ''),
 ('', '', ''),
 ('', '', ''),
 ('', '', ''),
 ('dog', '', ''),
 ('dog', '', ''),
 ('', '', ''),
 ('', '', ''),
 ('', '', ''),
 ('', 'cat', ''),
 ('', '', '')]

这里出了什么问题?如何修复正则表达式

我更期待这样的结果:

[('', 'cat', ''),
 ('dog', '', ''),
 ('', '', 'aaa'),
 ('dog', '', ''),
 ('dog', '', ''),
 ('', '', 'bbb'),
 ('', 'cat', '')]

Tags: the字符串restringregexcatbbbcompile
3条回答

正则表达式将从\u字符串的位置0开始,或者更具体地说,从the_string[0]开始使用您提供的替代项搜索匹配项:首先是dog,如果没有找到,则是cat,最后是.*?(即“0项,除非我需要匹配更多项”)

如果正则表达式找不到dogcat.*?,则此时,它将在字符串中进一步插入一个字符:the_string[1],然后在该新点重试

.*?表示匹配“零个或多个字符,尽可能少的次数”,这与表示“在the_string[0]位置匹配一个零长度的字符串”相同,它总是这样做:结果总是“空”

要做到这一点,最棘手的方法是说:dogcat或“所有文本直到dogcat”:

(dog)|(cat)|((?:(?!dog|cat).)*)

结果is this

它不是很干净,而且有点慢,所以您可能需要尝试另一种方法:删除文本中的所有dogcat,剩下的就是您想要的剩余文本

第三个字符串是任意的,可能存在也可能不存在! 就是这样

the_string='catdogaaadogdogbbbcat'
re.compile('(dog)|(cat)|(\w{3}?)').findall(the_string)
[('', 'cat', ''), ('dog', '', ''), ('', '', 'aaa'), ('dog', '', ''), ('dog', '', ''), ('', '', 'bbb'), ('', 'cat', '')]

希望有帮助

如果没有额外的条件,.*?将匹配任何空字符串。请求后跟dogcat或文本结尾:

(dog)|(cat)|(.*?)(?=dog|cat|$)

演示:https://regex101.com/r/UPwom6/1

相关问题 更多 >

    热门问题