Соответствие выражений в Windows, но не в Mac

Следующее регулярное выражение

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

соответствует следующей строке (с добавленной новой строкой)

  _FIRST_ELEMENT_      = 10000,

на Windows, но не на Mac. Среда, в которой я ее использую, - это реализация Cinema 4D (3D Software) на Python, использующая интерпретатор CPython 2.6.

Кто-то смог сделать для меня быстрый тест, потому что у меня нет 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.

Единственное, о чем я могу думать, это то, что подчеркивание (_) не входит в \w на Mac.

Знаете ли вы, почему регулярное выражение соответствует в Windows, но не в Mac?

2 ответа

Решение

Используйте это вместо:

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

Mac OS X и Windows используют разные символы для обозначения конца строки в текстовых файлах; похоже, что ваш файл использует разновидность Windows. "\n", я полагаю, соответствует символу (символам), используемому операционной системой, в которой выполняется код, что может не совпадать с символами, используемыми в файле. Использование "$" вместо "\n" в регулярном выражении должно работать в любой операционной системе (даже если это объяснение не совсем корректно).

Я предполагаю, что символ новой строки \n это проблема, так как она не одинакова на всех системах.

Вы можете сделать что-то более общее, как

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

это будет соответствовать \r с дополнительным \n следующий или только \nЯ думаю, что это будет охватывать все комбинации, которые в настоящее время используются как последовательности новой строки.

Другие вопросы по тегам