Проверить наличие символа от начала строки
Хочу в каждой строке проверять наличие даты. Так как формат дат может быть разный - использую регулярку для проверки наличия символа | от начала
Если вставить весь текст, то регулярка ^[^|]* корректно определяет что оно в первой строке.
Однако если в каждой строке по отдельности искать есть или нет символ | - то получается что там даже где нет находит совпадение
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')
Посмотрите на результаты вашего теста:
Почему это происходит: среди выбранных флагов есть флаг m, который разрешает оператору ^ находить начало любой строки в тексте. Вы, наверное, подумали, что всё, выражение работает только построчно. Нет, это не так, [^...] – отрицающий (негативный) символьный класс, который находит любой символ кроме тех, которые указаны в данном классе. Если вы не укажете символы перевода на новую строку в таком классе, он найдёт переводы строки.
Но это ещё не всё. Так как ваше выражение не проверяет наличие символа |, любая строка без этого символа будет найдена. Добавьте блок предварительного просмотра вперёд, (?=\|), сразу после ^[^|\r\n]*.
Решение
^[^|\r\n]*(?=\|)

