Python正则表达式错误地匹配尾随换行符

时间:2015-01-08 04:11:30

标签: python regex python-2.7

带有结束锚($)的正则表达式在匹配时完全忽略了尾随换行符的存在。

实施例

import re

regex = re.compile(r'^$')

text = "\n"
print regex.match(text)

以上代码段将匹配包含" \ n"的文本。由于上面的正则表达式在开始和结束锚点之间没有任何内容,我认为它应该只匹配空字符串。

有没有办法解决这种问题?

P.S。 上面的代码是一个简化的正则表达式来说明问题。我使用的实际正则表达式是:

re.compile(r'^\S(?:\S| (?!\s)){0,199}$(?<=\S)')

其中也匹配包含尾随换行符的文本。

1 个答案:

答案 0 :(得分:5)

使用\Z匹配缓冲区的末尾,\A匹配缓冲区的开头。

更新:^$没有做到你想要的是因为匹配$的规则是:

  • 如果缓冲区以换行符$在最终换行符之前匹配
  • 否则$匹配缓冲区的结尾

如果使用re.MULTLINE编译正则表达式,那么$也会在任何内部换行符之前匹配。

以下是一些演示此内容的代码:

import re

def showit(r, inp):
  ms = r.finditer(inp)
  for i,m in enumerate(ms):
    print "  match", i, " start:", m.start(0), " end:", m.end(0)
  print ""

print "regex x$ against x\\nx"
showit(re.compile("x$"), "x\nx")

print "regex x$ against x\\nx\\n"
showit(re.compile("x$"), "x\nx\n")

print "regex x$ re.MULTILINE against x\\nx"
showit(re.compile("x$", re.MULTILINE), "x\nx")

输出:

regex x$ against x\nx
  match 0  start: 2  end: 3

regex x$ against x\nx\n
  match 0  start: 2  end: 3

regex x$ re.MULTILINE against x\nx
  match 0  start: 0  end: 1
  match 1  start: 2  end: 3