Skip to content

Commit

Permalink
move yargy to regex inro seminar
Browse files Browse the repository at this point in the history
  • Loading branch information
mannefedov committed Sep 12, 2024
1 parent 12858e9 commit 861ddce
Showing 1 changed file with 109 additions and 4 deletions.
113 changes: 109 additions & 4 deletions notebooks/first_module_intro/01_regular_expressions.ipynb
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@
},
{
"cell_type": "code",
"execution_count": 1,
"execution_count": 3,
"id": "fd61238b",
"metadata": {},
"outputs": [],
Expand Down Expand Up @@ -59,7 +59,7 @@
},
{
"cell_type": "code",
"execution_count": 2,
"execution_count": 4,
"id": "c35d90c7",
"metadata": {},
"outputs": [],
Expand Down Expand Up @@ -1946,13 +1946,118 @@
"Еще больше фичей regex можно узнать тут - https://pypi.org/project/regex/"
]
},
{
"cell_type": "markdown",
"id": "54d4b7f4",
"metadata": {},
"source": [
"Регуляки очень быстро разрастаются до нечитаемых колбас символов. Если регулярка нужна больше одного раза, то поддерживать ее очень сложно - достаточно пары дней, чтобы забыть контекст и перестать понимать, что вообще происходит и зачем. Для таких случаев можно писать ругялки в многострочном формате и даже с комментариями!\n",
"\n",
"\n",
"Давайте посмотрит как это выглядит. Чтобы это заработало нужно передать доп флаг re.VERBOSE или re.X и потом можно делать пробельные отступы между символами, отступать новые строки и писать комментарии"
]
},
{
"cell_type": "code",
"execution_count": 6,
"id": "06666518",
"metadata": {},
"outputs": [],
"source": [
"import re\n",
"\n",
"# пример строки, так часто выглядят логи\n",
"example = \"2024-09-10 14:55:23 INFO Some event occurred\"\n",
"\n",
"# эту регуляку еще можно усложнить если добавить другие форматы дат/времени или учитывать что часы могут быть только от 0 до 23, а не любые две цифры рядом\n",
"pattern = re.compile(r\"\"\"\n",
" ^ # начало строки\n",
" (?P<date>\\d{4}-\\d{2}-\\d{2}) # дата в формате YYYY-MM-DD\n",
" \\s+ # один или несколько пробелов\n",
" (?P<time>\\d{2}:\\d{2}:\\d{2}) # время в формате HH:MM:SS\n",
" \\s+ # опять пробелы\n",
" (?P<level>INFO|DEBUG|ERROR|WARNING) # тип ошибки\n",
" \\s+ # пробелы\n",
" (?P<message>[A-Za-z0-9 ]+) # сообщение ошибки\n",
" $ # конец строки\n",
"\"\"\", re.VERBOSE)"
]
},
{
"cell_type": "code",
"execution_count": 8,
"id": "08ec494a",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Match found!\n",
"Date: 2024-09-10\n",
"Time: 14:55:23\n",
"Level: INFO\n",
"Message: Some event occurred\n"
]
}
],
"source": [
"# Еще в регуляке выше заданы группы и каждой приписано имя\n",
"# в итоге код будет выглядеть очень понятно и читаемо \n",
"match = pattern.match(example)\n",
"\n",
"if match:\n",
" print(\"Match found!\")\n",
" print(f\"Date: {match.group('date')}\")\n",
" print(f\"Time: {match.group('time')}\")\n",
" print(f\"Level: {match.group('level')}\")\n",
" print(f\"Message: {match.group('message')}\")\n",
"else:\n",
" print(\"No match found\")\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "54d4b7f4",
"id": "75c5eea1",
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": 5,
"id": "b03855a2",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"'ДАННОЕ СООБЩЕНИЕ (МАТЕРИАЛ) СОЗДАНО И (ИЛИ) РАСПРОСТРАНЕНО ИНОСТРАННЫМ СРЕДСТВОМ МАССОВОЙ ИНФОРМАЦИИ, ВЫПОЛНЯЮЩИМ ФУНКЦИИ ИНОСТРАННОГО АГЕНТА, И (ИЛИ) РОССИЙСКИМ ЮРИДИЧЕСКИМ ЛИЦОМ, ВЫПОЛНЯЮЩИМ ФУНКЦИИ ИНОСТРАННОГО АГЕНТА'"
]
},
"execution_count": 5,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"text"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "9b6800e3",
"metadata": {},
"outputs": [],
"source": [
"re.findall(\"\"\"\n",
" (?:пре|пере|по)? # префикс\n",
" \\. # основа\n",
" \\d * # постфикс\n",
" \"\"\", text, re.X)"
]
}
],
"metadata": {
Expand All @@ -1971,7 +2076,7 @@
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.9.14"
"version": "3.10.9"
}
},
"nbformat": 4,
Expand Down

0 comments on commit 861ddce

Please sign in to comment.