【问题标题】:Expression matches on Windows but not on Mac表达式在 Windows 上匹配,但在 Mac 上不匹配
【发布时间】:2012-05-15 13:46:01
【问题描述】:

下面的正则表达式

\s*([\w_]*)\s*(,\s*|=\s*(\d*)\s*,)\n

匹配以下行(带有附加换行符)

  _FIRST_ELEMENT_      = 10000,

在 Windows 上,但不在 Mac 上。我使用它的环境是使用 CPython 2.6 解释器的 Cinema 4D(3D 软件)的 Python 实现。

有人能够为我做一个快速测试,因为我没有 Mac。但是他没有时间为我做更多的测试。

在两个平台 (Win/Mac) 上,相同的代码已在 Cinema 4D 的脚本窗口中进行了测试。

import re
enum_match = re.compile('\s*(\w*)\s*(,\s*|=\s*(\d*)\s*,)\n')
line = '  _FIRST_ELEMENT_      = 10000,\n'
match = enum_match.match(line)

if not match:
    print "Regex did not match."
else:
    print match.groups()

Windows 上的输出:

('_FIRST_ELEMENT_', '= 10000,', '10000')

Mac 上的输出:

Regex did not match.

我唯一能想到的是,Mac 上的\w 中不包含下划线 (_)。

你知道为什么正则表达式在 Windows 上匹配而在 Mac 上不匹配吗?

【问题讨论】:

  • 在 Snow Leopard 上运行良好,捆绑了 Python 2.5/2.6 以及 MacPorts 的 Python 2.6/2.7。请注意,Windows 使用 \r\n 换行,而 OSX 仅使用 \n(默认情况下),但这似乎与这个特定示例无关,因为您明确使用 \n。这可能取决于您的输入文件使用什么。

标签: python regex cross-platform cinema-4d


【解决方案1】:

改用这个:

 enum_match = re.compile('\s*(\w*)\s*(,\s*|=\s*(\d*)\s*,)$')

Mac OS X 和 Windows 使用不同的字符来标记文本文件中的行尾;您的文件似乎使用了 Windows 版本。我相信,'\n' 与运行代码的操作系统使用的字符匹配,这可能不是文件中使用的字符。在正则表达式中使用 '$' 而不是 '\n' 应该适用于任一操作系统(即使这种解释不太正确)。

【讨论】:

  • 小修正:\n 在不同平台上有不同的解释。 \n 始终表示文字换行符(ASCII 字符 0x0A。)类似地,\r 始终表示文字回车符(ASCII 0x0d。)要看到这一点,请在 Python 中尝试 re.compile('\r',re.DEBUG)
  • @Li-aungYip:感谢您的更正。我想我在读取/写入文件时将此与换行处理混淆了。
【解决方案2】:

我认为换行符 \n 是问题所在,因为它在所有系统上都不相同。

你可以做一些更一般的事情,比如

\s*([\w_]*)\s*(,\s*|=\s*(\d*)\s*,)(?:\r\n?|\n)

这将匹配\r 和可选的\n,或者仅匹配\n,我认为这将涵盖现在用作换行符序列的所有组合。

【讨论】:

  • 您将使用[\n\r]{1,2}\n\n 捕获两行返回。
  • @Bruno 如果每行只有一个换行符,并且后面的一行只包含像\n\n 这样的换行符,则为真。
  • @jadkik94 不能单独匹配 \r
  • @stema, \r 最后一次用于 Mac OS 9,这是相当古老的(显然在 2002 年停产)。
  • @stema 对,我不知道它在什么地方被使用过。从 OP 评论中的链接看来,它已在某些旧 Mac 中使用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多