Ответ 1
^.*\['(.*)'\].*$
будет соответствовать строке и отображать то, что вы хотите в группе.
Вам нужно избежать [
и ]
с помощью \
Документация на странице rubula.com объяснит, как формируется выражение.
Как я могу использовать regx для возврата всех символов между двумя скобками. Вот пример:
foobar['infoNeededHere']ddd
needs to return infoNeededHere
Я нашел регулярное выражение для этого между фигурными скобками, но все попытки заставить его работать с квадратными скобками потерпели неудачу. Вот это регулярное выражение: (?<={)[^}]*(?=})
и вот моя попытка взломать его
(?<=[)[^}]*(?=])
Окончательное решение:
import re
str = "foobar['InfoNeeded'],"
match = re.match(r"^.*\['(.*)'\].*$",str)
print match.group(1)
^.*\['(.*)'\].*$
будет соответствовать строке и отображать то, что вы хотите в группе.
Вам нужно избежать [
и ]
с помощью \
Документация на странице rubula.com объяснит, как формируется выражение.
Если вы новичок в REG (gular) EX (нажатия), вы узнаете о них в Python Docs. Или, если вы хотите более внимательное введение, вы можете проверить HOWTO. Они используют синтаксис стиля Perl.
Выражение, которое вам нужно, .*?\[(.*)].*
. Группа, которую вы хотите, будет \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 <
Если есть только один из этих токенов [.....]
на строку, то вам вообще не нужно использовать регулярные выражения:
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']