Регулярний вираз в python - потрібна допомога

Як і багато інших людей, які розміщують запитання тут, я нещодавно почав програмування в Python. Я стикаюсь з проблемою, намагаючись визначити регулярний вираз, щоб витягнути назву змінної (у мене є список імен змін, збережених у списку) з рядка. Я аналізую частину коду, який я беру по рядку по рядку з файлу. Я складаю список змінних:

>>> variable_list = ['var1', 'var2', 'var4_more', 'var3', 'var1_more']

Що я хочу зробити, це визначити re.compile з тим, що не буде сказати, що він знайшов два var1 ; Я хочу скласти точну відповідність. Згідно з прикладом вище, var має нічого не збігатися, var1 має відповідати лише першому елементу списку.

Я припускаю, що відповідь може поєднувати регулярні вирази з запереченням інших регулярних виразів, але я не знаю, як вирішити цю проблему.

Добре, я помітив, що я пропустив одну важливу річ. Перемінний список збирається з рядка, тому можна мати пробіл перед ім'ям var, або підписати після. Більш точний variable_list буде щось схоже на

>>> variable_list = [' var1;', 'var1 ;', 'var1)', 'var1_more']

У цьому випадку він повинен визнати перший 3, але не останній, як var1.

1
Додатковий код та/або пояснення будуть корисними. Не зрозуміло, що ви маєте на увазі за допомогою "витягування назви змінної". Ви хочете створити окремий регулярний вираз для кожної змінної, яка знає назву змінної заздалегідь, або ви хочете повторно, що відповідає будь-якій назві змінної? Чи може бути в цих рядках інші речі (наприклад, чи є вони виразами), або вони просто імена змінних, які ви хочете перевірити на дійсність?
додано Автор Laurence Gonsalves, джерело
Будь ласка, правильно форматуйте свій код.
додано Автор agf, джерело
Я хотів би зробити щось подібне до того, як зробити re.compile ("someregex)% s (someregex)", змінна), де змінна повинна бути одна зі списку відомих змінних, таких як known_variables = ['var1', 'var2', ' var1_more '] для для змінної у known_variables:
додано Автор petrovic, джерело

3 Відповіді

Схоже, вам просто потрібно прив'язувати ваш регулярний вираз з ^ і $ , якщо я не розумію вас належним чином:

>>> 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']
2
додано
@petrovic: Я додав редагування щодо вашого другого прикладу.
додано Автор eldarerathis, джерело
Я трохи редагував це питання, але до цих пір це виконує роботу, яку мені це потрібно зробити, за питання, яке я задавав на першому місці.
додано Автор petrovic, джерело
Дякую, це вирішить проблему. :)
додано Автор petrovic, джерело

Якщо ви намагаєтеся дізнатись про регулярні вирази, то, можливо, це корисна головоломка, але якщо ви хочете побачити, чи є певне слово в списку слів, чому б не це:

>>> 'var1' in mylist
True
>>> 'var1 ' in mylist
False
0
додано
Проблема з цим полягає в тому, що я склав список з файлу, і я не впевнений у форматі цих рядків. У вашому прикладі, як var1, так і var1 повинні бути істинними відповідно до того, що мені потрібно.
додано Автор petrovic, джерело

Не розширюйте занадто багато на відповідність регулярному вираженню, але ви можете використовувати "filter ()" вбудований:

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']
0
додано
ІТ КПІ - Python
ІТ КПІ - Python
625 учасників

Канал обговорень про всякі штуки зі світу пайтону. Прохання: 0. мати повагу одне до одного; 1. не матюкатися в сторону людей; 2. не захламляти тред повідомленнями по одному слову;