Регулярное выражение для разбора файлов формата sfv

Я пытаюсь написать регулярное выражение для анализа файла sfv в python. В основном строки имеют формат

имя файла crc_bytes

но пробелы могут быть добавлены повсюду, включая имя файла. так что настоящий формат

(пробелы) имя файла (пробелы) crc_bytes (пробелы)

когда имя файла может содержать пробелы.

Теперь я пытаюсь извлечь имя файла и crc_bytes. Итак, я пробовал:

'\s*(.+)\s+([^\s]+)'

но он проанализирован

'   filename with spaces    crc  '

as

'filename with spaces   ', 'crc' 

// слишком много пробелов------------^

Любая идея, как избавиться от этих пробелов? наверное, задним числом как-то?

Бонусный вопрос:

Комментарии в файлах sfv — это строки, начинающиеся с «;». Если кто-то сможет обрабатывать комментарии в регулярном выражении, я навсегда буду перед ним в долгу.

Спасибо!!


person poochon    schedule 01.11.2012    source источник
comment
Не могли бы вы опубликовать пример для строки с комментарием?   -  person Adam Matan    schedule 01.11.2012
comment
извините... я перепроверил и только строки, которые начинаются с ; комментарии. я должен использовать просмотр вперед?   -  person poochon    schedule 01.11.2012
comment
Если это первый символ, вы можете просто отрицать его :[^;]   -  person Adam Matan    schedule 01.11.2012
comment
и, конечно же, привязать его: ^[^;]. Благодарность! :)   -  person poochon    schedule 01.11.2012
comment
хм.. ^[^;] проглатывает первую букву. Так что вперед, в любом случае? :)   -  person poochon    schedule 01.11.2012
comment
Укажите его в скобках   -  person Adam Matan    schedule 01.11.2012
comment
но если вы поместите его сразу в начало регулярного выражения, у вас будет '(^[^;]\s*.+\S)\s+(\S+)' и вы также найдете пробелы   -  person poochon    schedule 01.11.2012


Ответы (1)


Обработка имен файлов с пробелами

Использование (.+\S) заставляет имя файла заканчиваться символом, отличным от пробела ('\S).

>>> import re
>>> reg=re.compile('\s*(.+\S)\s+(\S+)')
>>> reg.findall(line)
[('filename with spaces', 'crc')]

Избегание комментариев

Вы можете использовать предварительный просмотр или добавить проверки отрицания в регулярное выражение. Однако я думаю, что добавление еще одного регулярного выражения было бы более читабельным:

>>> comment_line_regex=re.compile('\s*;.*')
>>> line1='   filename with spaces    crc  '
>>> line2=';  filename with spaces    crc  '
>>> line3='  ;  filename with spaces    crc  '
>>> lines = [line1, line2, line3]

Теперь у нас есть три строки, две из которых являются строкой комментариев. Следующий код анализирует только те строки, которые не являются комментариями:

>>> [reg.findall(l) for l in lines if not comment_line_regex.match(l)]
[[('filename with spaces', 'crc')]]

Или, более подробно:

>>> for line in lines:
...     if not comment_line_regex.match(line):
...             print reg.findall(line)
... 
[('filename with spaces', 'crc')]
person Adam Matan    schedule 01.11.2012
comment
Наверное здорово! Я уехал оттуда несколько лет назад :-) - person Adam Matan; 01.11.2012
comment
ну, это значит, что вы давно не обновляли страницу своего профиля :) - person poochon; 01.11.2012