Как сопоставить только первое вхождение строки в строке с регулярным выражением - PullRequest
2 голосов
/ 07 ноября 2019

У меня есть шаблон регулярного выражения -\w{8}- для извлечения определенных данных, но я хочу получить только первое вхождение этого в каждой строке

У меня есть данные

access-list xxx line 328 extended permit object-group RLS-Test-5ee67f4d-service-ports
access-list xxx line 329 extended permit object-group WEB-564dcfd5-service-ports123-
access-list xxx line 330 extended permit object-group WEB-564dcfd5-service-ports
access-list xxx line 331 extended permit object-group WEB-564dcfd5-service-ports-openwire-2
access-list xxx line 332 extended permit object-group RLS-Test-2-73d6bba4-service-ports-openwire-1
access-list xxx line 333 extended permit object-group RLS-Test-2-73d6bba4-service-ports-openwire-2
access-list xxx line 334 extended permit object-group SQL-85145d21-web-ports
access-list xxx line 335 extended permit object-group SQL-85145d21-open-access
access-list xxx line 336 extended permit object-group SQl-85145d21-open-access

Iхочу, чтобы он возвращал:

-5ee67f4d-
-564dcfd5-
-73d6bba4-
-85145d21-

Но если я использую регулярное выражение -\w{8}-, он также выберет другие слова из 8 символов между дефисами далее по строке. См. https://regex101.com/r/1rS2Gl/4/

Можно ли выбрать только первое в каждой строке? Я пробовал другие методы, но, похоже, в результате возвращается только первая строка и пропускаются остальные данные.

Ответы [ 2 ]

1 голос
/ 07 ноября 2019

Прочитайте текст или файл построчно и используйте re.search, чтобы найти первое вхождение в каждой строке и собрать значения группы 1:

import re
data = """access-list xxx line 329 extended permit object-group WEB-564dcfd5-service-ports123-
access-list xxx line 330 extended permit object-group WEB-564dcfd5-service-ports
access-list xxx line 331 extended permit object-group WEB-564dcfd5-service-ports-openwire-2
access-list xxx line 332 extended permit object-group RLS-Test-2-73d6bba4-service-ports-openwire-1
access-list xxx line 333 extended permit object-group RLS-Test-2-73d6bba4-service-ports-openwire-2
access-list xxx line 334 extended permit object-group SQL-85145d21-web-ports
access-list xxx line 335 extended permit object-group SQL-85145d21-open-access
access-list xxx line 336 extended permit object-group SQl-85145d21-open-access"""
results = []

rx = re.compile(r'-(\w{8})-')

for line in data.splitlines():
    m = rx.search(line)
    if m:
        results.append(m.group(1))
        # Use results.append(m.group()) if you really need to include hyphens

print(results)
# => ['564dcfd5', '564dcfd5', '564dcfd5', '73d6bba4', '73d6bba4', '85145d21', '85145d21', '85145d21']

См. Демонстрационную версию Python эта демонстрация выводит совпадения с дефисами).

1 голос
/ 07 ноября 2019

Похоже, ваши строки имеют тот же набор символов, что и стандартный GUID. Попробуйте -[abcdef0-9]{8}- ограничить его шестнадцатеричными цифрами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...