Самый pythoni c способ разбора специфики c подстроки в строке? - PullRequest
1 голос
/ 20 февраля 2020

У меня есть следующий журнал, и я хочу извлечь второй «DDD -xxxxx» идентификатор из каждой записи (если существует второй DDD id):

cs:444 - br:/main/j_DDD-50535/DDD-68009
cs:445 - br:/main/j_DDD-50535/j_DDD-70220
cs:446 - br:/main/j_DDD-50535/j_DDD-70117
cs:447-Merge from branch: /main/j_DDD-50544/j_DDD-61183
Requested by: Smith, John (UserID1)
cs:448-Merge from branch: /main/j_DDD-4822
Requested by: Grant, Huge (userID2)
cs:449-Daily automated release of 3.5.5.4

Используя регулярное выражение, я нашел обходной путь, чтобы получить их, но я думаю, что должно быть возможно получить намного проще:

def read_log():
    log_file_name = "log"
    with open(log_file_name, "r") as file:
        log_file = file.read().split("cs:")
    return log_file

def key_creator():
    log_data = read_log()

    keys = []
    for line in log_data:
        # print(line)
        if line[:5].isdigit():
            search = re.search('/j_(.*)\n', line)
            if hasattr(search, "group"):
                search = search.group(1).split('/j_')

                if 1 < len(search) and search[1][:3] == "DDD":
                    keys.append(search[1])
                    print(line)
    return keys

key_creator()

Редактировать: Просто чтобы уточнить: - за строкой DDD может следовать неопределенное количество цифр, (DDD -23, DDD -342, DDD -4842, DDD -44332 ... также возможны записи)

Ответы [ 2 ]

1 голос
/ 20 февраля 2020

Вы можете использовать правильный шаблон регулярного выражения для соответствия вашему запросу:

def key_creator():
    log_data = read_log()

    keys = []
    for line in log_data:
        # print(line)
        search = re.search('/j_(DDD_\d{5})\n', line)
        if search is not None:
             keys.append(search.group(1))
             print(line)
    return keys

В шаблоне требуется строка DDD, за которой следует подчеркивание и ровно 5 цифр. Возвращаемое значение не равно, если строка не найдена, и в противном случае она возвращает две группы: одну с полным соответствием (группа (0)) и одну с содержанием только круглых скобок (группа (1)), что уже Вы ищете.

1 голос
/ 20 февраля 2020
def key_creator():
    log_data = read_log()
    keys = []
    for line in log_data:
        s = re.findall(r'(DDD-\d+)', line)
        if s and len(s)>1:
            keys.append(s[1])
    return keys
...