1

下面的正则表达式

\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 上不匹配吗?

4

2 回答 2

2

改用这个:

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

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

于 2012-05-15T13:58:19.360 回答
1

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

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

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

这将\r与可选的\n后续匹配,或者仅匹配\n,我认为这将涵盖当今用作换行符序列的所有组合。

于 2012-05-15T13:52:42.170 回答