Python 带fall-through的重复正则表达式
假设你有一个字符串:'catdogfoxcat' 我可以使用下面的正则表达式轻松地拆分它:Python 带fall-through的重复正则表达式,python,regex,Python,Regex,假设你有一个字符串:'catdogfoxcat' 我可以使用下面的正则表达式轻松地拆分它: re.compile('(狗)|(猫)|(狐狸)).findall(字符串) 在python中,结果是: [('', 'cat', ''), ('dog', '', ''), ('', '', 'fox'), ('dog', '', ''), ('dog', '', ''), ('', '', 'fox'), ('', 'cat', '')] 这是完美的 现在,让我们将该字符串更改为:“ca
re.compile('(狗)|(猫)|(狐狸)).findall(字符串)
在python中,结果是:
[('', 'cat', ''),
('dog', '', ''),
('', '', 'fox'),
('dog', '', ''),
('dog', '', ''),
('', '', 'fox'),
('', 'cat', '')]
这是完美的
现在,让我们将该字符串更改为:“catdogaaadogdogbbbcat”
如果第三个regex项是任意的(aaa/bbb/随便什么),我就不知道该怎么做。例如,我想要这样的东西:re.compile('(狗)|(猫)|(.*)).findall(字符串)
目前我得到了以下结果,这毫无意义
[('', 'cat', ''),
('dog', '', ''),
('', '', ''),
('', '', ''),
('', '', ''),
('dog', '', ''),
('dog', '', ''),
('', '', ''),
('', '', ''),
('', '', ''),
('', 'cat', ''),
('', '', '')]
这里出了什么问题?如何修复正则表达式
我更希望这样的结果:
[('', 'cat', ''),
('dog', '', ''),
('', '', 'aaa'),
('dog', '', ''),
('dog', '', ''),
('', '', 'bbb'),
('', 'cat', '')]
如果没有额外条件,
*?
将匹配任何空字符串。要求后面跟有dog
、cat
,或文本结尾:
(dog)|(cat)|(.*?)(?=dog|cat|$)
演示:如果没有附加条件,
*?
将匹配任何空字符串。要求后面跟有dog
、cat
,或文本结尾:
(dog)|(cat)|(.*?)(?=dog|cat|$)
演示:第三个字符串是任意的,可能存在也可能不存在! 就是
希望有帮助 第三个字符串是任意的,可能存在也可能不存在! 就是
希望有帮助 正则表达式将从\u字符串的位置0开始,或者更具体地说,
字符串[0]
,并将使用您提供的替代项开始搜索匹配项:首先是狗
,如果没有找到,则是猫
,最后是*?
(即“0项,除非我需要匹配更多项”)
如果正则表达式找不到dog
或cat
或*?
,则此时,它将在字符串中进一步插入一个字符:字符串[1]
,然后在该新点重试
*?
表示匹配“零个或多个字符,尽可能少的次数”,这与表示“在位置匹配零长度字符串[0]
”,这将始终执行:结果始终为“空”
要做到这一点,最棘手的方法是说:dog
或cat
或“所有文本直到dog
或cat
”:
结果呢
它不是很干净,而且有点慢,因此您可能需要尝试另一种方法:删除文本中的所有
dog
和cat
,剩下的就是您想要的剩余文本。正则表达式将从\u字符串的位置0开始,或者更具体地说,从\u字符串[0]开始并将开始使用您提供的替代项搜索匹配项:首先是狗
,如果未找到,则是猫
,最后是*?
(即“0项,除非我需要匹配更多项”)
如果正则表达式找不到dog
或cat
或*?
,则此时,它将在字符串中进一步插入一个字符:字符串[1]
,然后在该新点重试
*?
表示匹配“零个或多个字符,尽可能少的次数”,这与表示“在位置匹配零长度字符串[0]
”,这将始终执行:结果始终为“空”
要做到这一点,最棘手的方法是说:dog
或cat
或“所有文本直到dog
或cat
”:
结果呢
它不是很干净,而且有点慢,因此您可能需要尝试另一种方法:删除文本中的所有
dog
和cat
,剩下的就是您想要的剩余文本。我宁愿。*
将匹配空序列。这绝对不是你想要的。您想要匹配的任意对象的要求是什么?我宁愿。*
将匹配一个空序列。这绝对不是你想要的。你想要匹配的任意对象有什么要求?耶!附言:美元是绝对必要的吗?这与OP的期望输出不匹配。也就是说,这也给出了一个空的匹配组<代码>[(“猫”、“猫”、“狗”、“aaa”)、(“狗”、“狗”、“bbb”)、(“猫”、“bbb”)、(“猫”、“猫”、“aaa”)、(“狗”、“aaa”)、(“狗”、“bbb”)、(“猫”、“bbb”)、(“猫”、“aaa”)Ok。如果字符串不包含任何cat/dog,那么似乎毕竟需要$。这就是为什么('','')
也出现在结果中的原因!耶!附言:美元是绝对必要的吗?这与OP的期望输出不匹配。也就是说,这也给出了一个空的匹配组<代码>[(“猫”、“猫”、“狗”、“aaa”)、(“狗”、“狗”、“bbb”)、(“猫”、“bbb”)、(“猫”、“猫”、“aaa”)、(“狗”、“aaa”)、(“狗”、“bbb”)、(“猫”、“bbb”)、(“猫”、“aaa”)Ok。如果字符串不包含任何cat/dog,那么似乎毕竟需要$。这就是为什么('','')
也出现在结果中的原因!
(dog)|(cat)|((?:(?!dog|cat).)*)