Я хотел бы вернуть все строки в указанных начальной и конечной строках.

Дана строка libs = 'libr(lib1), libr(lib2), libr(lib3), req(reqlib), libra(nonlib)'.

В приведенной выше строке libs я хотел бы найти строки, которые находятся между libr( и ) или строку между req( и ).

Я хочу вернуть ['lib1', 'lib2', 'lib3', 'reqlib']

import re 
libs = 'libr(lib1), libr(lib2), libr(lib3), req(reqlib), libra(nonlib)'
pat1 = r'libr+\((.*?)\)'
pat2 = r'req+\((.*?)\)'
pat = f"{pat1}|{pat2}"
re.findall(pat, libs)

Приведенный выше код в настоящее время возвращает [('lib1', ''), ('lib2', ''), ('lib3', ''), ('', 'reqlib')], и я не знаю, как это исправить.

3
FireM 16 Фев 2021 в 15:42

2 ответа

Сделать это можно так:

pat1 = r'(?<=libr\().*?(?=\))'
pat2 = r'(?<=req\().*?(?=\))'

Он использует положительный просмотр назад (?<=) и положительный просмотр вперед (?=).

  • .*?: выбирает все символы между ними. Я назову это "содержание"
  • (?<=libr\(): "содержание" должно предшествовать libr( (мы избегаем ()
  • ?(?=\)): после содержания должен стоять ) (( также экранируется)

Полный код:

import re 
libs = 'libr(lib1), libr(lib2), libr(lib3), req(reqlib), libra(nonlib)'
pat1 = r'(?<=libr\().*?(?=\))'
pat2 = r'(?<=req\().*?(?=\))'
pat = f"{pat1}|{pat2}"
result = re.findall(pat, libs)
print(result)

Выход:

['lib1', 'lib2', 'lib3', 'reqlib']
0
Rivers 16 Фев 2021 в 13:03

Я думаю, что распространенный способ сделать это - использовать чередование в слове, которое вы хотели бы поставить перед шаблоном, который вы хотите зафиксировать:

\b(?:libr|req)\(([^)]+)

См. Интерактивную демонстрацию

  • \b - Граница слова.
  • (?: - открытая группа без захвата:
    • libr|req - соответствие "libr" или "req".
    • ) - закрыть группу без захвата.
  • \( - буквальная открывающая скобка.
  • ( - открыть группу захвата:
    • [^)]+ - соответствие 1+ символов помимо закрывающей скобки.
    • ) - Закрыть группу захвата.

Демонстрация Python:

import re
libs = 'libr(lib1), libr(lib2), libr(lib3), req(reqlib), libra(nonlib)'
lst = re.findall(r'\b(?:libr|req)\(([^)]+)', libs)
print(lst)

Печать:

['lib1', 'lib2', 'lib3', 'reqlib']
0
JvdV 16 Фев 2021 в 13:10
66224539