Регулярное выражение для возврата всех символов между двумя специальными символами

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

foobar['infoNeededHere']ddd
needs to return infoNeededHere

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

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

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

import re

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

Ответы на вопрос(3)

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

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']
Решение Вопроса

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

Вы должны избежать[ а также] с участием\

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

 user113016127 мар. 2012 г., 14:38
У вас есть хороший источник для изучения регулярных выражений?
 user113016127 мар. 2012 г., 14:42
Я использую это с re.search?
 user113016127 мар. 2012 г., 14:45
a = re.search("^.*\['(.*)'\].*$","foobar['infoNeededHere']ddd") print a.group() возвращаетсяfoobar['infoNeededHere']ddd
 akhter wahab27 мар. 2012 г., 14:41
@ user1130161 надеюсь, это поможет выделитьregular-expressions.info
 user17780027 мар. 2012 г., 14:49
перечитайте документы наsearch(), match() а такжеgroups(num)

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

Regex

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

Реализация

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

>>> 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 руды и один был принят. :( х <

Ваш ответ на вопрос