重复正则表达与通过

时间:2017-03-27 15:09:35

标签: python regex

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

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

在python中,你得到了结果:

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

哪个是完美的。

现在让我们将该字符串更改为:'catdogaaadogdogbbbcat'

如果第三个正则表达式项是任意的(aaa / bbb / whatever),我无法弄清楚如何做到这一点。即我想要这样的东西:re.compile('(dog)|(cat)|(.*?)').findall(the_string)

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

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

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

我更期待这样的结果:

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

3 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:1)

正则表达式将从 the_string 的位置0开始,或者更具体地说,the_string[0],并将使用您提供的替换开始搜索匹配:首先dog和,如果找不到,cat,最后.*?(" 0项,除非我需要匹配更多")。

如果正则表达式找不到dogcat.*?,那么此时它会将一个字符进一步放入字符串:the_string[1]并重试在那个新点上。

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

执行此操作的棘手方法是:dogcat或"所有文字UNTIL dogcat":

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

结果is this

它不是很干净,而且速度有点慢,所以您可能想尝试不同的方法:删除文本中的所有dogcat,剩下的是你想要的剩余文本。

答案 2 :(得分:0)

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

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

希望它有所帮助!