У меня есть такая строка:
«Задание 1233: name_uuid (таблица n_Cars_1234567$20220316) выполнено. Записей: 24, с ошибками: 0».
Я хотел бы получить данные из имени таблицы, пока я использую:
"\$[0-9]+"
но это дает $20220316. Как получить только дату, без $?
Я также хотел бы получить имя таблицы: n_Cars_12345678$20220316
Пока у меня это:
pattern_table_info = "\(([^\)]+)\)"
pattern_table_name = "(?<=table ).*"
table_info = re.search(pattern_table_info, message).group(1)
table = re.search(pattern_table_name, table_info).group(0)
Однако я хотел бы иметь более простое решение, как я могу его улучшить?
Обновлено:
На самом деле имя таблицы должно быть:
n_Cars_12345678
Итак, все до знака "$" и после "таблицы"... как можно получить эту часть строки?
Вы можете использовать регулярное выражение с двумя группами захвата:
table\s+([^()]*)\$([0-9]+)
См. демонстрация регулярных выражений. Подробности:
table
- слово\s+
- один или несколько пробелов([^()]*)
- Группа 1: ноль или более символов, кроме (
и )
\$
- $
символ([0-9]+)
- Группа 2: одна или несколько цифр.См. демонстрация Python:
import re
text = "Job 1233:name_uuid (table n_Cars_1234567$20220316) done. Records: 24, with errors: 0."
rx = r"table\s+([^()]*)\$([0-9]+)"
m = re.search(rx, text)
if m:
print(m.group(1))
print(m.group(2))
Выход:
n_Cars_1234567
20220316
спасибо, я только что обновил сообщение, так как требуемое имя таблицы было неверным.
@pymat Переместите закрывающую скобку группы 1: table\s+([^()]*)\$([0-9]+)
, см. эта демонстрация регулярных выражений.
Вы можете написать один шаблон с двумя группами захвата:
\(table (\w+\$(\d+))\)
Шаблон соответствует:
\(table
(
Снять группа 1\w+\$
найдите более 1 символа слова и $
(\d+)
Захватите группа 2, сопоставьте 1+ цифры)
Закрыть группу 1\)
Матч )
См. Демонстрация регулярных выражений и демонстрация Python.
import re
s = "Job 1233:name_uuid (table n_Cars_1234567$20220316) done. Records: 24, with errors: 0."
m = re.search(r"\(table (\w+\$(\d+))\)", s)
if m:
print(m.group(1))
print(m.group(2))
Выход
n_Cars_1234567$20220316
20220316
спасибо, я только что обновил сообщение, так как требуемое имя таблицы было неверным.
@pymat Вы по-прежнему правильно понимаете те же группы, и группа 1 имеет n_Cars_12345678
теперь regex101.com/r/xsn0NL/1
Группа 1 дает: n_Cars_12345678$20220316, а требуется только n_Cars_12345678
@pymat Тогда вы можете использовать 2 группы захвата, но не вложенные \(table (\w+)\$(\d+)\)
regex101.com/r/GlyAQf/1
Для даты: используйте положительное выражение, например:
(?<=\$)[0-9]+
, что означает «Найти первое число в строке, перед которым стоит$
».