Проверить наличие символа от начала строки

Хочу в каждой строке проверять наличие даты. Так как формат дат может быть разный - использую регулярку для проверки наличия символа | от начала

Если вставить весь текст, то регулярка ^[^|]* корректно определяет что оно в первой строке. Однако если в каждой строке по отдельности искать есть или нет символ | - то получается что там даже где нет находит совпадение

2022-04-14 17:16:45.896 | ERROR    | app.services.xxx.services:eosd:38 - (<class 'KeyError'>, KeyError('data'), <traceback object at 0x75b968f5c180>)
Traceback (most recent call last):

  File "/env/bin/uvicorn", line 8, in <module>
    sys.exit(main())
    │   │    └ <Command main>

введите сюда описание изображения


Ответы (2 шт):

Автор решения: Сергей Кох

Формат дат настолько разный, что трудно подобрать что-то работающее при любом случае. Проще посмотреть на ваши данные и найти что-то, за что можно "зацепиться". Например, в большинстве форматов даты год состоит из четырех цифр, а если вы смотрите файл за этот год, то достаточно найти подстроку "2022".

 with open("...", "r") as file:
    for line in file:
# Берем первую часть строки
        dt = line.split(r'|', maxsplit=1)[0]
# и ищем в нем год
        if dt.find('2022') < 0:
            print('False')
        else:
            print('True')
→ Ссылка
Автор решения: Wiktor Stribiżew

Посмотрите на результаты вашего теста:

введите сюда описание изображения

Почему это происходит: среди выбранных флагов есть флаг m, который разрешает оператору ^ находить начало любой строки в тексте. Вы, наверное, подумали, что всё, выражение работает только построчно. Нет, это не так, [^...] – отрицающий (негативный) символьный класс, который находит любой символ кроме тех, которые указаны в данном классе. Если вы не укажете символы перевода на новую строку в таком классе, он найдёт переводы строки.

Но это ещё не всё. Так как ваше выражение не проверяет наличие символа |, любая строка без этого символа будет найдена. Добавьте блок предварительного просмотра вперёд, (?=\|), сразу после ^[^|\r\n]*.

Решение

^[^|\r\n]*(?=\|)

См. пример регулярного выражения.

→ Ссылка