2016-05-04 5 views
0

Входной файл содержит следующие строки:Извлечение переменных с использованием регулярных выражений питона

a=b*c; 
d=a+2; 
c=0; 
b=a; 

Теперь для каждой строки, я хочу, чтобы извлечь переменные, которые были used.For например, для линии 1, выход должен быть [a,b,c] .Currently I я делаю следующее:

var=[a,b,c,d]  # list of variables 
for line in file_ptr : 
    if '=' in line : 
     temp=line.split('=') : 
     ans=list(temp[0]) 
     if '+' in temp[1] : 
      # do something 
     elif '*' in temp[1] : 
      # do something 
     else : 
      # single variable as line 4 OR constant as line 3 

Возможно ли это с помощью регулярного выражения?

EDIT:

Ожидаемый результат для указанного выше файла:

[a,b,c] 
[d,a] 
[c] 
[a,b] 
+0

Как это вопрос слишком широк? – AkaSh

+0

Какой результат вы ожидаете от введенного вами ввода? –

+0

@ Robᵩ Я добавил их в вопрос – AkaSh

ответ

1

Я хотел бы использовать re.findall() с любым шаблоном соответствует переменному на mes в языке программирования примера. Предполагая типичный язык, это может работать для вас:

import re 

lines = '''a=b*c; 
d=a+2; 
c=0; 
b=a;''' 

for line in lines.splitlines(): 
    print re.findall('[_a-z][_a-z0-9]*', line, re.I) 
+0

Много thnx !! Не могли бы вы немного объяснить .. – AkaSh

+0

[Этот ответ] (http://stackoverflow.com/a/24541431/2564301) содержит объяснение @AkaSh. Имена переменных Python чувствительны к регистру, поэтому для этого требуется флаг Ignore Case (или, альтернативно, всего несколько 'A-Z'). Тем не менее, я бы выбрал несколько '\ b' для согласованности. – usr2564301

0

Если вы хотите только переменные, то сделать это:

answer = [] 
for line in file_ptr : 
    temp = [] 
    for char in line: 
     if char.isalpha(): 
      temp.append(char) 
    answer.append(temp) 

Слово предостережения, хотя: это будет работать только с переменными длиной в 1 символ. Более подробную информацию о isalpha() можно найти here или here.

0

Я не совсем уверен, что вы после этого, но вы можете сделать что-то вроде этого:

re.split(r'[^\w]', line) 

дать список буквенных символов в строке:

>>> re.split(r'[^\w]', 'a=b*c;') 
['a', 'b', 'c', ''] 
+1

'a',' b', 'c' являются переменными. Это элементы списка' var' – AkaSh

+0

Извините, я понятия не имею, что вы имеете в виду. –

+1

Это не соответствует примерам с цифрами; цифры также являются «символами слов» и поэтому будут включены. Это может быть тривиально исправлено, особенно если Python 're' поддерживает' [[: alpha:]] '.Однако для имени переменной «any» вам нужно другое выражение только для первого символа и для всех следующих, потому что 'a0' является допустимым именем переменной. – usr2564301

0

Это, как я сделал:

l=re.split(r'[^A-Za-z]', 'a=b*2;') 
l=filter(None,l) 
1

Я хотел бы использовать некоторые более короткий шаблон для сопоставления имен переменных:

import re 
strs = ['a=b*c;', 'd=a+2;', 'c=0;', 'b=a;'] 
print([re.findall(r'[_a-z]\w*', x, re.I) for x in strs]) 

См Python demo

Pattern матчей:

  • [_a-z] - a _ или буква ASCII (любой верхний или нижний регистр из-за ca нечувствительный к использованию модификатора re.I)
  • \w* - 0 или более буквенно-цифровых символов или символов подчеркивания.

См regex demo

Смежные вопросы