Я хотел бы вернуть все строки в указанных начальной и конечной строках.
Дана строка 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')]
, и я не знаю, как это исправить.
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']
Я думаю, что распространенный способ сделать это - использовать чередование в слове, которое вы хотели бы поставить перед шаблоном, который вы хотите зафиксировать:
\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']
Похожие вопросы
Новые вопросы
python
Python - это многопарадигмальный, динамически типизированный, многоцелевой язык программирования. Он разработан для быстрого изучения, понимания и использования, а также для обеспечения чистого и единообразного синтаксиса. Обратите внимание, что Python 2 официально не поддерживается с 01.01.2020. Тем не менее, для вопросов о Python, связанных с версией, добавьте тег [python-2.7] или [python-3.x]. При использовании варианта Python (например, Jython, PyPy) или библиотеки (например, Pandas и NumPy) включите его в теги.