Рубрики
Без рубрики

Python Regex. вернуть строку между скобками

Сортировка задачи дана строка с. Как найти подстроку S ‘между открытым и закрывающим скобками? Рассмотрим следующие примеры: Вход: «Узнайте Python (не C ++)». «Не C ++ ‘вход:« Функция (A, B, C, D) »:« A, B, C, D »вход:’ (A + (B + C )) Выход: ‘A + (B + C)’ Способ 1: нарезка и ул. Образ () Самый простой способ извлечения … Python Regex для возврата строки между скобками Подробнее »

Автор оригинала: Chris.

Постановка проблемы

Учитывая строку с . Как найти подстроку S ' между открытым и закрывающим скобками?

Рассмотрим следующие примеры:

Input:     'Learn Python (not C++)'
Output:  'not C++'

Input:     'function(a, b, c, d)'
Output:  'a, b, c, d'

Input:     '(a+(b+c))'
Output:  'a+(b+c)'

Способ 1: нарезка и ул. Образ ()

Самый простой способ извлечения строки между двумя скобками – использовать нарезка и string.find () Отказ Во-первых, найдите индексы первых вхождений открытия и закрытия скобок. Во-вторых, используйте их как индексы среза, чтобы получить подстроку между этими показателями, как: s [s.find ('(') + 1: s.find (')')] .

Вот простой пример:

s = 'Learn Python (not C++)'
result = s[s.find('(')+1:s.find(')')]
print(result)

Результатом является строка:

'not C++'

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

Способ 2: Нарезка и RFind ()

В качестве альтернативы вы также можете использовать String.Rfind () Способ поиска закрывающих скобок справа вместо левого для создания более значимых выходов для вложенных скобок.

s = '(Learn Python (not C++))'

print(s[s.find('(')+1:s.find(')')])
# Learn Python (not C++

print(s[s.find('(')+1:s.rfind(')')])
# Learn Python (not C++)

Если закрывающие скобки не существуют, выход string.find () Метод –1, что означает, что он ломтит весь путь вправо, но исключая последний символ строки.

Это примерено здесь:

s = 'Learn Python (not C++'
result = s[s.find('(')+1:s.find(')')]
print(result)

Очевидно, что это не цель операции. Итак, мы можем сделать лучше? И можем ли мы найти все вхождения в случае, если есть несколько таких строк?

да. Regex к спасению!

Метод 3: Найти все вхождения с Re.findall ()

Чтобы найти все строки между двумя скобками, позвоните в Re.findall () Функция и пройти шаблон '\ (. *? \)' ' В качестве первого аргумента и строки для поиска в качестве второго аргумента.

  • . *? Часть соответствует произвольному количеству персонажей, но это не жадный Не совсем соответствовать другим скобкам.
  • '\ (... \)' Часть соответствует открытию и закрывающим скобкам. Вам нужно побег Символы круглых скобок, чтобы сказать двигатель Regex, который вы не хотите, чтобы это предположило, что это Regex Group Работа, которая также начинается с скобок.
import re
s = '(Learn Python) (not C++)'
result = re.findall('\(.*?\)', s)
print(result)

Вывод – это список совпадений:

['(Learn Python)', '(not C++)']

Вы можете посмотреть следующее видео, объясняя Re.findall () Функция:

Но что, если у вас вложенные скобки в строке '(Учить Python (не C ++))' ? В этом случае он больше не работает, потому что весь текст между внешними скобками будет соответствовать шаблону '\ (. *? \)' ' .

import re
s = '(Learn Python (not C++))'
result = re.findall('\(.*?\)', s)
print(result)

Давайте рассмотрим более продвинутое решение, с которым я придумал.

Способ 4: Найти все вхождения в строках с вложенными скобками

Чтобы найти все вхождения даже в строке с вложенными скобками, вы можете последовательно поискать все подстроки, начиная с данного индекса запуска в контуре для цикла:

import re
s = '(Learn Python (not C++))'
results = set()
for start in range(len(s)):
    string = s[start:]
    results.update(re.findall('\(.*?\)', string))
print(results)
# {'(Learn Python (not C++)', '(not C++)'}

Это выполняет следующие шаги:

  • Создайте пустой набор, чтобы объединить все соответствующие строки в него, но избегайте дубликатов.
  • Итайте для всех начальных индексов от 0 до длины строки, которую нужно искать, минус один.
  • Создайте подстроку с помощью нарезки S [Пуск:] Для поиска вложении скобок.
  • Найдите следующие строки, заключенные в скобки, используя Re.findall ('\ (. *? \', строка) и добавьте их в комплект.

Резюме

Самый простой способ извлечения строки между двумя скобками – использовать нарезка и string.find () Отказ Во-первых, найдите индексы первых вхождений открытия и закрытия скобок. Во-вторых, используйте их как индексы среза, чтобы получить подстроку между этими показателями, как: s [s.find ('(') + 1: s.find (')')] .

В качестве альтернативы вы также можете использовать String.Rfind () Способ поиска закрывающих скобок справа вместо левого для создания более значимых выходов для вложенных скобок:

Чтобы найти все строки между двумя скобками, позвоните в Re.findall () Функция и пройти шаблон '\ (. *? \)' ' В качестве первого аргумента и строки для поиска в качестве второго аргумента.

Чтобы найти все вхождения даже в строке с вложенными скобками, вы можете последовательно поискать все подстроки, начиная с заданного индекса запуска в цикле.

Курс Python Regex

Инженеры Google являются регулярными мастерами. Система поисковой системы Google – это массивная Текстово-обработка двигателя Это извлекает значение из триллионов веб-страниц.

Инженеры Facebook являются регулярными мастерами экспрессии. Социальные сети, такие как Facebook, WhatsApp, и Instagram Подключите людей через Текстовые сообщения Отказ

Инженеры Amazon являются регулярными мастерами экспрессии. Ecommerce Giants корабля продуктов на основе Описания текстовых продуктов Отказ Регулярные выражения правит игре, когда текстовая обработка соответствует информатике.

Если вы хотите стать регулярным мастером выражения, проверьте Самый полный курс Python Regex на планете:

Работая в качестве исследователя в распределенных системах, доктор Кристиан Майер нашел свою любовь к учению студентов компьютерных наук.

Чтобы помочь студентам достичь более высоких уровней успеха Python, он основал сайт программирования образования Finxter.com Отказ Он автор популярной книги программирования Python одноклассники (Nostarch 2020), Coauthor of Кофе-брейк Python Серия самооставленных книг, энтузиаста компьютерных наук, Фрилансера и владелец одного из лучших 10 крупнейших Питон блоги по всему миру.

Его страсти пишут, чтение и кодирование. Но его величайшая страсть состоит в том, чтобы служить стремлению кодер через Finxter и помогать им повысить свои навыки. Вы можете присоединиться к его бесплатной академии электронной почты здесь.