Соответствие выражений в 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
Я думаю, что это будет охватывать все комбинации, которые в настоящее время используются как последовательности новой строки.