2015-11-17 4 views
3

Я пытаюсь разобрать строку, которая имеет следующий формат:Python RegEx для точных совпадений скобок

text="some random string <inAngle> <anotherInAngle> [-option text] [-anotherOption <text>] [-option (Y|N)]" 

Я хочу, чтобы разбить строку на три части.

  1. Просто «некоторые случайные строки»
  2. Все, что только в угловых скобках. I.E inAngle и anotherInAngle выше.
  3. Все, что находится в квадратных скобках.

Если я использую RegEx

re.findall(r'\[(.+?)\]', text) 

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

re.findall(r'<(.+?)>', text) 

Это дает текст, который находится в пределах угловой скобки, которые находятся в квадратных скобках тоже. Так, например, «текст» сверху, который находится внутри [-anotherOption]. Мне этого не надо. Соответствие RegEx для углового кронштейна должно возвращать только «inAngle» «anotherInAngle» сверху. Для чего нужен RegEx?

Также как получить только первую часть i.e «некоторая случайная строка». Эта строка может иметь 2 или 3 количество слов

+0

Каким будет ваш ожидаемый выход? –

ответ

1

Вы можете просто игнорировать все в квадратных скобках перед поиском вещей в угловых скобках:

interm = re.sub(r'\[(.*?)\]', '', text) 
re.findall(r'<(.+?)>', interm) 

выходах

['inAngle', 'anotherInAngle'] 

то для согласования первого часть, соответствует всем до [ или <.Конечно это не будет работать, если строка разрешено произвольно иметь один из этих символов незакрытые внедренных в первой части:

re.findall(r'([^<\[]+)', text)[0] 

выходы

some random string 
+0

Спасибо всем. все решения хороши, но я поеду с Macmee, так как его легче читать, когда я вставляю код, который у меня есть :). Еще одна проблема, с которой я столкнулся, заключается в том, что в somecases совпадению угловых скобок предшествует слово. Например: некоторая случайная строка -aWord . Я хочу также получить часть -aWord вместе со строкой. Как это получить? – user775093

1

Попробуйте, если это регулярное выражение будет capture то, что вам нужно

\s*([^><[\]]+\b)|\[([^]]*)]|<([^>]*)> 
  • \s*, предшествующий опциональному whitespace
  • ([^><[\]]+\b) Группа 1: Любые non скобках до \b (удалить, если нежелательная)
  • |\[([^]]*)] или группы 2: Что внутри квадратных скобок
  • |<([^>]*)> или группа 3: Что внутри угловые скобки

See demo at regex101 (использование «генератор кода», если необходимо)

Смежные вопросы