Я хочу использовать регулярное выражение для возврата индекса в Python - PullRequest
0 голосов
/ 02 мая 2019

Я хочу получить индекс из массива.

Например:

s = "arr[2]"

Я хочу использовать регулярное выражение для возврата индекса [2]

Обновлено! Я также хочу вернуть имя массива (обр)

Ответы [ 4 ]

3 голосов
/ 02 мая 2019

Это должно сделать это способом регулярных выражений! (Найти все возможные числа в квадратных скобках []

def get_idx(s):
    m = re.search(r"\[([-?a-zA-Z0-9_]+)\]", s)
    return m.group(1)

Тогда вы можете проверить это как

print(get_idx("arr[2]"))
#2
print(get_idx("arr[24]"))
#24
print(get_idx("arr[245]"))
#245
print(get_idx("arr[-2]"))
#-2
print(get_idx("arr2[-2]"))
#-2
print(get_idx("arr2[hex]"))
#hex

Чтобы получить имя массива, вы можете сделать

def get_name(s):
    m = re.search(r"(.*)\[.*", s)
    return m.group(1)

Тогда вы можете проверить это как

import re

def get_name(s):
    m = re.search(r"(.*)\[.*", s)
    return m.group(1)

print(get_name("arr[2]"))
#arr
print(get_name("arr[24]"))
#arr
print(get_name("arr[245]"))
#arr
print(get_name("arr[-2]"))
#arr
print(get_name("arr2[-2]"))
#arr2
0 голосов
/ 02 мая 2019

Для вашего примера более чем достаточно:

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, если это то, что вам нужно.

0 голосов
/ 02 мая 2019

Это должно работать

re.search("\[(-?\d+)\]", s).group(1)

Чтобы узнать больше о Regex, пройдите по этой ссылке

0 голосов
/ 02 мая 2019

Существует способ без regex

s[s.find("[")+1:s.find("]")]

Если вы хотите использовать regex, вы можете использовать следующее:

import re
re.search(r'\[(.*?)\]',s).group(1)

В обоих методах выводследующее:

2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...