regex, чтобы получить весь текст вне скобок

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

Пример строки

Джози Смит [3996 КОЛЛЕДЖ АВЕНЮ, SOMETOWN, MD 21003] Mugsy Dog Smith [2560 OAK ST, GLENMEADE, WI 14098]

Я могу получить текст в квадратных скобках с помощью:

addrs = re.findall(r"\[(.*?)\]", example_str) print addrs [u'3996 COLLEGE AVENUE, SOMETOWN, MD 21003',u'2560 OAK ST, GLENMEADE, WI 14098'] 

но у меня возникли проблемы с получением чего-либо за пределами квадратных скобок. Я пробовал что-то вроде следующего:

 names = re.findall(r"(.*?)\[.*\]+", example_str) 

но это только находит имя:

 print names [u'Josie Smith '] 

До сих пор я видел только строку, содержащую от одного до двух коммандов name [address] , но я предполагаю, что в строке может быть любое их число.

4 Solutions collect form web for “regex, чтобы получить весь текст вне скобок”

Если вложенных скобок нет, вы можете просто сделать это:

 re.findall(r'(.*?)\[.*?\]', example_str) 

Тем не менее, вам действительно не нужно регулярное выражение. Просто разделите на скобки:

 (s.split(']')[-1] for s in example_str.split('[')) 

Единственная причина, по которой ваша попытка не срабатывала:

 re.findall(r"(.*?)\[.*\]+", example_str) 

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


Кроме того, + на конце кажется неправильным. Если у вас есть 'abc [def][ghi] jkl[mno]' , вы хотите вернуться ['abc ', '', ' jkl'] или ['abc ', ' jkl'] ? Если первое, не добавляйте + . Если это последнее, сделайте – но тогда вам нужно поместить весь скобочный шаблон в группу, не связанную с захватом: r'(.*?)(?:\[.*?\])+ .


Если после последней скобки может быть добавлен дополнительный текст, метод split будет работать нормально, или вы можете использовать re.split вместо re.findall … но если вы хотите настроить исходное регулярное выражение для работы с ним, вы можете.

На английском языке, что вы хотите, является любой (не жадной) подстрокой перед подстрокой, заключенной в скобки или концом строки, правильно?

Итак, вам нужно чередование между \[.*?\] И $ . Конечно, вам нужно сгруппировать это, чтобы написать чередование, и вы не хотите захватывать группу. Так:

 re.findall(r"(.*?)(?:\[.*?\]|$)", example_str) 

Если вложенные скобки отсутствуют:

 ([^[\]]+)(?:$|\[) 

Пример:

 >>> import re >>> s = 'Josie Smith [3996 COLLEGE AVENUE, SOMETOWN, MD 21003]Mugsy Dog Smith [2560 OAK ST, GLENMEADE, WI 14098]' >>> re.findall(r'([^[\]]+)(?:$|\[)', s) ['Josie Smith ', 'Mugsy Dog Smith '] 

Объяснение:

 ([^[\]]+) # match one or more characters that are not '[' or ']' and place in group 1 (?:$|\[) # match either a '[' or at the end of the string, do not capture 

вы можете сделать это:

  outside = re.findall(r"[^[]+(?=\[[^]]*]|$)", example_str) 

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

Если вы хотите использовать регулярное выражение и по-прежнему обрабатывать вложенные скобки, вы можете использовать:

 import re expr = re.compile("(?:^|])([^[\]]+)(?:\[|$)") print(expr.findall("myexpr[skip this[and this]]another[and skip that too]")) 

Это даст ['myexpr', 'another'] .

Идея состоит в том, чтобы сопоставить что-либо между началом строки или ] и концом строки или [ .

  • почему python regex так медленно?
  • Регулярные выражения Python: как получить доступ к нескольким совпадениям группы?
  • Регулятор Python не работает
  • Найти и заменить подстроку Regex в Python
  • Python: regex findall
  • Как я могу перевести следующее имя файла в регулярное выражение в Python?
  • совпадение конечной косой черты с регулярным выражением Python
  • Почему Python findall () и finditer () возвращают пустые совпадения в unanchored. * Search?
  •  
    Interesting Posts for Van-Lav

    Удаление нецифровых символов из строки

    Использовать `rpy2` с пакетами, установленными для` R` в виртуальной среде conda?

    В Python в Unix определите, использую ли я свой компьютер? или в режиме ожидания?

    Преобразование формата Time Zone + в Python из API Twitter

    NameError: имя 'get_ipython' не определено

    scrapy spider отправляет сигнал spider_close перед закрытием

    Как показать мелкие метки на логарифмической шкале с помощью Matplotlib

    Преобразование времени RFC 3339 в стандартную метку времени Python

    Python: длина самого длинного подсети?

    Как я могу показать линейку км на графике / matplotlib?

    'utf-8' кодек не может декодировать байт 0x89

    как проверить, соответствуют ли 3 символа в последовательном альфа-порядке

    Как взять входной файл из терминала для сценария python?

    Напишите список в файле csv python, одну новую строку в списке

    Невозможно правильно использовать wx.NotificationMessage с помощью wxPython

    Python - лучший язык программирования в мире.