Регулярен израз за анализиране на файлове във формат 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
съжалявам... проверих отново и само редове, които започват с ; са коментари. трябва ли да използвам lookahead?   -  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