Если вы новичок в 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>