Ну, я бы сказал, что если вы знаете, что за частью идентификатора всегда стоит ELI-
, за которой следует число и что это число всегда стоит за @
в начале, то я бы не считывал идентификатор на шаге 1 Непосредственно работайте на шаге 2 с этим регулярным выражением и заменой:
https://regex101.com/r/QBQB7E/1
Вы сможете создавать содержимое своего нового поля только с одним присваивание с результатом подстановки старого поля. Идея ускорить процесс состоит в том, чтобы избежать использования 4-5 строк кода для выполнения операции получения идентификатора, его поиска и последующей перекомпоновки результата. Регулярное выражение и шаблон замещения могут делать все это за одну операцию.
Вы можете сгенерировать некоторый код Python непосредственно из Regex101, чтобы интегрировать его для создания содержимого поля new_name
.
Пояснение
^(.*?)@(\d+)(.*)$
- это регулярное выражение
^
означает «начиная с». $
означает «окончание». ()
- захват группы и создание переменной, которую мы затем можем использовать в шаблоне замены. \1
для первой подходящей группы, \2
для второй и т. Д. c. .*?
соответствует любому символу от нуля до неограниченного числа раз, как можно меньше раз, расширяясь по мере необходимости (ленивый ). @
соответствует символу @ буквально (с учетом регистра). \d+
соответствует значению di git (равно [0-9]) один или несколько раз. .*
соответствует любому символу от нуля до неограниченного числа раз, столько раз, сколько возможно, возвращая при необходимости (жадность).
Строка замены \1\3#\2
, поэтому он берет первую группу соответствия, за которой следует последняя, а затем добавляет #
, за которым следует вторая группа соответствия, которая является вашим идентификатором.
С точки зрения скорости самого регулярного выражения, его также можно изменить немного, чтобы найти более быструю версию, в зависимости от того, как она написана.
Вторая версия:
^([^@]+)@(\d+)(.*)$
, где я заменил .*?
на [^@]+
, что означает найти любой символ, который не @
один или несколько раз. - Решение ее e: https://regex101.com/r/QBQB7E/3
Протестировал код, и я получил его примерно за 4 секунды ...
import timeit
code_to_test = """
import re
regex = r"^([^@]+)@(\d+)(.*)$"
subst = "\\1\\3#\\2"
df = {
"ID": "ELI-123456789",
"bk_name": "AAAAA@123456789_BBBBB;CCCCC;"
}
df["new_name"] = re.sub(regex, subst, df["bk_name"])
"""
elapsed_time = timeit.timeit(code_to_test, number=4600000)
print(elapsed_time)
Я действительно думаю, что если вы кодируете работает через 7 часов, это, вероятно, где-то еще, где проблема. Движок регулярных выражений выглядит не намного медленнее, чем операции ручного поиска / замены.