Подтвердить что ты не робот

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

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

foobar['infoNeededHere']ddd
needs to return infoNeededHere

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

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

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

import re

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

Ответ 1

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

Вам нужно избежать [ и ] с помощью \

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

Ответ 2

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

Regex

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

>>> 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 <

Ответ 3

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

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

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

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

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

In [16]: re.findall(r"\[(.*?)\]",mystring)
Out[16]: ['Bacon', 'eggs', 'spam']