Регулярное выражение для возврата всех символов между двумя специальными символами - PullRequest
19 голосов
/ 27 марта 2012

Как бы я использовал regx, чтобы вернуть все символы в двух скобках. Вот пример:

foobar['infoNeededHere']ddd
needs to return infoNeededHere

Я нашел регулярное выражение, заключившее в фигурные скобки, но все попытки заставить его работать с квадратными скобками потерпели неудачу. Вот это регулярное выражение: (?<={)[^}]*(?=}) и вот моя попытка взломать его

(?<=[)[^}]*(?=])

Окончательное решение:

import re

str = "foobar['InfoNeeded'],"
match = re.match(r"^.*\['(.*)'\].*$",str)
print match.group(1)

Ответы [ 3 ]

30 голосов
/ 27 марта 2012

Если вы новичок в REG (gular) EX (нажатия), вы узнаете о них на Python Docs .Или, если вы хотите более мягкое представление, вы можете проверить HOWTO .Они используют синтаксис в стиле Perl.

Regex

Выражение, которое вам нужно - .*?\[(.*)\].*.Нужная группа будет \1.
- .*?: . соответствует любому символу, кроме новой строки.* является метасимволом и означает Повторите это 0 или более раз .? делает * не жадным, т. Е. . будет соответствовать как можно меньшему числу символов, прежде чем нажать '['.
- \[: \ escapeспециальные метасимволы, которые в данном случае [.Если бы мы этого не делали, [ вместо этого сделал бы что-то очень странное.
- (.*): Заключите в скобки «группы», что бы ни находилось внутри, и позже вы сможете извлечь группы по их числовому значению.Идентификаторы или имена (если они даны).
- \].*: К настоящему времени вы должны знать достаточно, чтобы понять, что это значит.

Реализация

Сначала импортируйте модуль re - он не является встроенным - туда, где вы хотите использовать выражение.

Затем используйте re.search(regex_pattern, string_to_be_tested) для поиска шаблона в строкедля тестирования.Это вернет MatchObject, который вы можете сохранить во временной переменной.Затем вы должны вызвать его метод group() и передать 1 в качестве аргумента (чтобы увидеть «Группу 1», которую мы захватили, используя скобки ранее).Теперь я должен выглядеть следующим образом:

>>> import re
>>> pat = r'.*?\[(.*)].*'             #See Note at the bottom of the answer
>>> s = "foobar['infoNeededHere']ddd"
>>> match = re.search(pat, s)
>>> match.group(1)
"'infoNeededHere'"

Альтернатива

Вы также можете использовать findall(), чтобы найти все непересекающиеся совпадения, изменив регулярное выражение на (?>=\[).+?(?=\]).
- (?<=\[): (?<=) называется проверочным утверждением и проверяет выражение , предшествующее фактическому соответствию.
- .+?: + аналогично *, за исключением того, что оно соответствует одному или более повторениям.?.
- (?=\]): (?=) делает утверждение forward и проверяет выражение follow совпадение без его захвата.
Ваш код теперь должен выглядеть следующим образом:

>>> import re
>>> pat = r'(?<=\[).+?(?=\])'  #See Note at the bottom of the answer
>>> s = "foobar['infoNeededHere']ddd[andHere] [andOverHereToo[]"
>>> re.findall(pat, s)
["'infoNeededHere'", 'andHere', 'andOverHereToo['] 

Примечание: Всегда используйте необработанные строки Python, добавляя 'r' передстрока (например: r'blah blah blah').

10x для чтения!Я написал этот ответ, когда еще не было ни одного принятого, но к тому времени, как я его закончил, подошли 2 руды и один был принят.:( x <</p>

20 голосов
/ 27 марта 2012

^.*\['(.*)'\].*$ будет соответствовать строке и захватывать то, что вы хотите в группе.

Вы должны сбежать с [ и ] с \

Документация по ссылке rubular.com proof объяснит, как формируется выражение.

8 голосов
/ 27 марта 2012

Если в строке есть только один из [.....] токенов, вам не нужно использовать регулярные выражения вообще:

In [7]: mystring = "Bacon, [eggs], and spam"

In [8]: mystring[ mystring.find("[")+1 : mystring.find("]") ]
Out[8]: 'eggs'

Если в строке более одного из них, вам нужно изменить регулярное выражение Джаррода ^.*\['(.*)'\].*$, чтобы оно совпадало с каждой строкой и не было жадным. (Используйте квантификатор .*? вместо квантификатора .*.)

In [15]: mystring = "[Bacon], [eggs], and [spam]."

In [16]: re.findall(r"\[(.*?)\]",mystring)
Out[16]: ['Bacon', 'eggs', 'spam']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...