Python 3.7与Python 2.7 RegEx匹配行为

时间:2018-08-17 12:13:36

标签: python regex

我在堆栈溢出中寻找了相当多的答案,但没有弹出。阅读提供的链接后,它仍然不明显,但我理解。也许保存此帖子对将来像我一样思考的人有帮助。

我已将3.7 vs 2.7问题简化为一个非常简单的代码段:

import re
myStr = "Mary   had a little lamb.\n"
reg_exp = re.compile('[ \\n\\r]*')
reg_exp.split(myStr)

['', 'M', 'a', 'r', 'y', '', 'h', 'a', 'd', '', 'a', '', 'l', 'i', 't', 't', 'l', 'e', '', 'l', 'a', 'm', 'b', '.', '', '']

在python 2.7中,我得到了完整的单词标记。我想将编译行修改为贪婪*而不拆分字符。

如果我不包括贪婪*我会得到多余的空格。

reg_exp = re.compile('[ \\n\\r]')
reg_exp.split(myStr)

['Mary', '', 'had', 'a', 'little', 'lamb.', '']

我也想吃我的蛋糕!这就是我想要的:

['Mary', 'had', 'a', 'little', 'lamb.']

我尝试了各种方法,例如各种标志。我缺少一些非常基本的东西。你能帮我吗?谢谢!

2 个答案:

答案 0 :(得分:1)

[ \\n\\r]*匹配空字符串

所以正确的行为是在每个字母后分开。 3.7之前的Python版本会忽略空匹配,但3.7版可以解决此问题。

您要将*替换为+

reg_exp = re.compile('[ \\n\\r]+')

3.6 docs3.7 docs

答案 1 :(得分:0)

使用+代替*

*将重复0次或更多次,因此它与""匹配并拆分每个字符。

+将重复1次或更多次,因此仅在找到内容时匹配。