Как и многие другие люди, задающие вопросы здесь, я недавно начал программировать на Python. Я столкнулся с проблемой, пытающейся определить регулярное выражение для извлечения имени переменной (у меня есть список имен переменных, сохраненных в списке) из строки. Я разбираю часть кода, который я беру по строке из файла. Я составляю список переменных:
>>> variable_list = ['var1', 'var2', 'var4_more', 'var3', 'var1_more']
Я хочу сделать, чтобы определить re.compile
с чем-то, что не скажет, что он нашел два var1
; Я хочу сделать точное совпадение. Согласно приведенному выше примеру, var
должен ничего сопоставлять, var1
должен соответствовать только первому элементу списка.
Я полагаю, что ответ может сочетать регулярное выражение с отрицанием другого регулярного выражения, но я не уверен, как решить эту проблему.
Хорошо, я заметил, что пропустил одну важную вещь. Список переменных собран из строки, поэтому возможно иметь пробел перед именем var или знак после. Более точный переменный_list будет чем-то вроде
>>> variable_list = [' var1;', 'var1 ;', 'var1)', 'var1_more']
В этом случае он должен распознать первые 3, но не последний, как var1.
Похоже, вам просто нужно привязать ваше регулярное выражение с помощью ^
и $
, если я не понимаю вас правильно:
>>> mylist = ['var1', 'var2', 'var3_something', 'var1_text', 'var1var1']
>>> import re
>>> r = re.compile(r'^var1$')
>>> matches = [item for item in mylist if r.match(item)]
>>> print matches
['var1']
Итак, ^var1$
будет точно соответствовать var1
, но не var1_text
или var1var1
. Это то, что вам нужно?
Я полагаю, что один способ обработки вашего редактирования будет с помощью ^\W*var1\W*$
(где var1
- это имя переменной, которое вы хотите). Класс символьных строк \W
соответствует любому, что не входит в класс \w
, а \w
в Python - в основном буквенно-цифровые символы и подчеркивание. *
Означает, что это может быть сопоставлено ноль или более раз. Это приводит к:
variable_list = [' var1;', 'var1 ;', 'var1)', 'var1_more']
>>> r = re.compile(r'^\W*var1\W*$')
>>> matches = [item for item in variable_list if r.match(item)]
>>> print matches
[' var1;', 'var1 ;', 'var1)']
Если вы хотите имя переменной без постороннего материала, вы можете ее захватить и извлечь первую группу захвата. Что-то вроде этого, может быть (возможно, немного неэффективно, так как регулярное выражение выполняется дважды по совпадающим элементам):
>>> r = re.compile(r'^\W*(var1)\W*$')
>>> matches = [r.match(item).group(1) for item in variable_list if r.match(item)]
>>> print matches
['var1', 'var1', 'var1']
Если вы пытаетесь узнать о регулярных выражениях, то, возможно, это полезная головоломка, но если вы хотите увидеть, есть ли определенное слово в списке слов, почему бы это не сделать:
>>> 'var1' in mylist
True
>>> 'var1 ' in mylist
False
Не увеличивать слишком много на регулярном выражении, но вы можете подумать об использовании встроенного фильтра():
filter(function, iterable)
Итак, используя одно из регулярных выражений, предложенное @eldarerathis:
>>> mylist = ['var1', 'var2', 'var3_something', 'var1_text', 'var1var1']
>>> import re
>>> r = re.compile(r'^var1$')
>>> matches = filter(r.match, mylist)
['var1']
Или используя свою собственную функцию соответствия:
>>> def matcher(value):
>>> ... match statement ...
>>> filter(matcher, mylist)
['var1']
Или сначала смените регулярное выражение на лямбда:
>>> filter(lambda x: not r.match(x), mylist)
['var2', 'var3_something', 'var1_text', 'var1var1']