Пушыстый (_winnie) wrote,
Пушыстый
_winnie

Мягкая твёрдость.

Наверное, многие сталкивались с тем, как ненадёжны регулярные выражения. Случайная опечатка или в самом regexp, или во входном потоке ведёт к ошибке. Wait, forgot to escape a space.
Иногда к очевидной, иногда к silent, когда какие-то нужные строчки просто тихо пропускаются.
Например, неожиданный пробел или запятая в имени файла.
Ещё хуже с парсингом игровых диалогов, написаных руками в текстовом файле.
Ещё бывает так, что внезапно меняется версия библиотеки регекспов (unready, привет! Помнишь Яндекс.Закладки?)
Хочется сделать более "устойчивый" код по отношению как к собственным, так и к чужим ошибкам.

Немного о том, как вместо silent сделать screaming assert.
Вот у меня есть лог, в нём - пачка строчек такого вида (вместе с другим мусором):

<tr><td><font color=#003f00>loading sound cafe\customers\angry\generic_alien.ogg, looped=0</font><td>844<td>0<td>337<td>.\sound.cpp<td>5<td></tr>
<tr><td><font color=#003f00>loading sound cafe\customers\angry\generic_man.ogg, looped=0</font><td>860<td>16<td>337<td>.\sound.cpp<td>5<td></tr>
<tr><td><font color=#003f00>loading sound cafe\customers\angry\generic_woman.ogg, looped=0</font><td>860<td>0<td>337<td>.\sound.cpp<td>5<td></tr>

Вместо того, что бы внимательно написать regexp, который выцепляет строчки с имем файла и значеним looped, я сначала проверяю каждую строку тупым условием, а есть ли в строке лога подстрока "loading sound".
После этого несоответствие регэкспу считается не поводом пропустить строчку, а ошибкой в написании regexp. Либо же что "мягкое условие" надо уточнять.

То есть, вместо простого "найди точно такие" я пишу "найди примерно такую, и обеспечь что она корректна":

sounds_load = re.findall(r"<tr><td><font color=#003f00>loading sound (.*?), looped=([01])</font>", text)

Меняется на:

def match_load(l):
    m = re.match(r"<tr><td><font color=#003f00>loading sound (.*?), looped=([01])</font>", l)
    assert m is not None
    return m.group(1), m.group(2)
sounds_load = [match_load(l) for l in text_lines if 'loading sound' in l]



PS. Вообще, старайтесь писать так, что бы ошибки - не проходили молчаливо. Хотя бы в dev-версии.
Tags: release, soft-dev
Subscribe
  • Post a new comment

    Error

    default userpic

    Your reply will be screened

    Your IP address will be recorded 

    When you submit the form an invisible reCAPTCHA check will be performed.
    You must follow the Privacy Policy and Google Terms of use.
  • 12 comments