假设你有这个字符串:'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', '')]
答案 0 :(得分:2)
如果没有额外条件,.*?
将匹配任何空字符串。请求其后跟dog
,cat
或文字结尾:
(dog)|(cat)|(.*?)(?=dog|cat|$)
答案 1 :(得分:1)
正则表达式将从 the_string 的位置0开始,或者更具体地说,the_string[0]
,并将使用您提供的替换开始搜索匹配:首先dog
和,如果找不到,cat
,最后.*?
(" 0项,除非我需要匹配更多")。
如果正则表达式找不到dog
或cat
或.*?
,那么此时它会将一个字符进一步放入字符串:the_string[1]
并重试在那个新点上。
.*?
表示匹配"零个或多个字符,尽可能少的次数"这与说"匹配位置the_string[0]
"的零长度字符串,它总是这样做:结果总是"空"。
执行此操作的棘手方法是:dog
或cat
或"所有文字UNTIL dog
或cat
":
(dog)|(cat)|((?:(?!dog|cat).)*)
结果is this。
它不是很干净,而且速度有点慢,所以您可能想尝试不同的方法:删除文本中的所有dog
和cat
,剩下的是你想要的剩余文本。
答案 2 :(得分:0)
第三个字符串是任意的,可能存在也可能不存在! 那是
the_string='catdogaaadogdogbbbcat'
re.compile('(dog)|(cat)|(\w{3}?)').findall(the_string)
[('', 'cat', ''), ('dog', '', ''), ('', '', 'aaa'), ('dog', '', ''), ('dog', '', ''), ('', '', 'bbb'), ('', 'cat', '')]
希望它有所帮助!