【问题标题】:Python 3.7 vs Python 2.7 RegEx Matching Behavior [duplicate]Python 3.7 与 Python 2.7 正则表达式匹配行为 [重复]
【发布时间】:2018-08-19 00:21:59
【问题描述】:

我看了很多关于堆栈溢出的答案,但什么都没有弹出。阅读提供的链接后仍然不明显,但我理解。也许保存这篇文章可以帮助未来像我一样思考的人。

我已将我的 3.7 与 2.7 问题简化为一个非常简单的代码 sn-p:

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.']

我尝试过各种各样的事情,比如各种标志。我错过了一些非常基本的东西。你能帮我吗?谢谢!

【问题讨论】:

  • 是 Python 3.7 吗?实际上,您希望在所有情况下得到什么输出?
  • 也许您想要+ 而不是*?实际上,您允许在有 0 个或更多空格的地方发生拆分,即 everywhere
  • 在您将其标记为重复后,我再次尝试。如果您愿意提供链接,我可以在正确分类这个问题方面取得一些进展。我得到了答案,所以我很高兴我还是问了......谢谢!

标签: python regex


【解决方案1】:

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

所以正确的行为是在每个字母之后拆分。 3.7 之前的 Python 版本忽略了空匹配,但 3.7 版本修复了这个问题。

您想将* 替换为+

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

3.6 docs, 3.7 docs

【讨论】:

  • 谢谢。工作。
【解决方案2】:

使用+ 而不是*

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

+ 会重复 1 次或多次,因此仅在找到某些内容时才匹配。

【讨论】:

    猜你喜欢
    • 2016-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多