Для вашего примера более чем достаточно:
import re
re.search(r"(.*)\[(.*)\]", s).groups()
Где s
- ваша строка, а .groups()
говорит Python возвратить группы, найденные в скобках ()
, в виде кортежа (<group1>, <group2>)
.Чтобы разбить его:
.
= любой не-символ новой строки *
= 0 или более раз ()
= разделить группусимволов, которые будут извлечены, в противном случае также будут возвращены квадратные скобки \[
и \]
= квадратные скобки необходимо экранировать с помощью \
, поскольку они являются специальными символами регулярного выражения (подробнее оEscape здесь )
Чтобы сложить это вместе: Извлеките любую группу из 0 или более символов, не являющихся символом новой строки, найденными перед квадратной скобкой [
, и извлеките и сгруппируйте0 или более символов, не являющихся символом новой строки, которые можно найти в двух квадратных скобках [
и ]
. В других решениях также используется специальный символ ?
, чтобы сделать сопоставление нежадным, но это не так.Это необходимо в вашем примере, так как есть только один набор квадратных скобок.
Помимо того, что он является более кратким, чем другие решения, он также лучше справляется с особыми случаями и извлекает все найденное до или внутри b.ракетки, то есть цифры, +
и -
, и любые индексы, заданные в качестве имен переменных, такие как x
:
re.search(r"(.*)\[(.*)\]", "arr[23]").groups()
## ('arr', '23')
re.search(r"(.*)\[(.*)\]", "arr[-23]").groups()
## ('arr', '-23')
re.search(r"(.*)\[(.*)\]", "arr[+23]").groups()
## ('arr', '+23')
re.search(r"(.*)\[(.*)\]", "arr-2[23]").groups()
## ('arr-2', '23')
re.search(r"(.*)\[(.*)\]", "arr[x]").groups()
## ('arr', 'x')
re.search(r"(.*)\[(.*)\]", "arr[FF00EE88]").groups()
## ('arr', 'FF00EE88')
Кроме того, не забывайте, что строки возвращаются, так что выВам нужно привести ваши индексы массива (второе значение в возвращаемом кортеже) в целые числа с int
, если это то, что вам нужно.