Регулярное выражение в Python - нужна помощь

1

Как и многие другие люди, задающие вопросы здесь, я недавно начал программировать на 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.

  • 0
    Было бы полезно больше кода и / или объяснений. Непонятно, что вы подразумеваете под «извлекать имя переменной». Вы хотите создать отдельное регулярное выражение для каждой переменной, заранее зная имя переменной, или вы хотите, чтобы re соответствовало любому имени переменной? Могут ли быть другие вещи в этих строках (например, являются ли они выражениями) или это просто имена переменных, которые вы хотите проверить на достоверность?
  • 0
    Я хотел бы сделать что-то вроде создания re.compile ("(someregex)% s (someregex)", переменная), где переменная должна быть одна из списка известных переменных, таких как known_variables = ['var1', 'var2', ' var1_more '] with для переменной в known_variables:
Показать ещё 1 комментарий
Теги:

3 ответа

2
Лучший ответ

Похоже, вам просто нужно привязать ваше регулярное выражение с помощью ^ и $, если я не понимаю вас правильно:

>>> 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']
  • 0
    Я немного отредактировал вопрос, но пока он выполняет работу, которая мне нужна, для вопроса, который я задал в первую очередь.
  • 0
    @petrovic: я добавил правку, касающуюся вашего второго примера.
Показать ещё 1 комментарий
0

Если вы пытаетесь узнать о регулярных выражениях, то, возможно, это полезная головоломка, но если вы хотите увидеть, есть ли определенное слово в списке слов, почему бы это не сделать:

>>> 'var1' in mylist
True
>>> 'var1 ' in mylist
False
  • 0
    Проблема в том, что я сделал список из файла, и я не уверен насчет формата этих строк. В вашем примере оба «var1» и «var1» должны быть истинными, в зависимости от того, что мне нужно.
0

Не увеличивать слишком много на регулярном выражении, но вы можете подумать об использовании встроенного фильтра():

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']

Ещё вопросы

Сообщество Overcoder
Наверх
Меню