【问题标题】:Bug with re.split function and re.DOTALL flag in re module of Python 2.7.1Python 2.7.1 的 re 模块中的 re.split 函数和 re.DOTALL 标志的错误
【发布时间】:2011-12-27 09:32:00
【问题描述】:

我有一台运行 Lion 和 Python 2.7.1 的 Mac。我从 re 模块中注意到一些非常奇怪的东西。如果我运行以下行:

print re.split(r'\s*,\s*', 'a, b,\nc, d, e, f, g, h, i, j, k,\nl, m, n, o, p, q, r')

我得到这个结果:

['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r']

但是如果我像这样使用 re.DOTALL 标志运行它:

print re.split(r'\s*,\s*', 'a, b,\nc, d, e, f, g, h, i, j, k,\nl, m, n, o, p, q, r', re.DOTALL)

然后我得到这个结果:

['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q, r']

请注意,'q, r' 被计为一个匹配而不是两个。

为什么会这样?如果我不在我的模式中使用点,我不明白为什么 re.DOTALL 标志会有所作为。是我做错了什么还是有什么错误?

【问题讨论】:

  • 我在几乎任何版本的 Python 上都得到了相同的结果。它按记录工作。阅读文档,调整预期。

标签: python regex python-2.7


【解决方案1】:
>>> s = 'a, b,\nc, d, e, f, g, h, i, j, k,\nl, m, n, o, p, q, r'
>>> re.split(r'\s*,\s*', s)
['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r']
>>> re.split(r'\s*,\s*', s, maxsplit=16)
['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q, r']
>>> re.split(r'\s*,\s*', s, flags=re.DOTALL)
['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r']

问题是您在位置上传递re.DOTALL,它设置maxsplit=0 参数,而不是flags=0 参数。 re.DOTALL 恰好是常量 16

【讨论】:

  • 谢谢。我花了很长时间才发现这一点,但是在别人指出之后,它似乎很明显。
  • 我遇到了一个复杂的正则表达式模式,我花了几个小时才明白这不是因为模式
猜你喜欢
  • 2023-03-14
  • 1970-01-01
  • 2013-12-23
  • 2016-03-31
  • 1970-01-01
  • 2018-12-10
  • 2016-11-09
  • 1970-01-01
  • 2022-11-09
相关资源
最近更新 更多