Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 带fall-through的重复正则表达式_Python_Regex - Fatal编程技术网

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

Python 带fall-through的重复正则表达式,python,regex,Python,Regex,假设你有一个字符串:'catdogfoxcat' 我可以使用下面的正则表达式轻松地拆分它: re.compile('(狗)|(猫)|(狐狸)).findall(字符串) 在python中,结果是: [('', 'cat', ''), ('dog', '', ''), ('', '', 'fox'), ('dog', '', ''), ('dog', '', ''), ('', '', 'fox'), ('', 'cat', '')] 这是完美的 现在,让我们将该字符串更改为:“ca

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

我可以使用下面的正则表达式轻松地拆分它:
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).)*)