2015-11-13 4 views
0

Мне нужно регулярное выражение, чтобы проанализировать строку, содержащую дроби и операцию [+, -, *, or /], и вернуть 5-элементный кортеж, содержащий числители, знаменатели и операцию, используя функцию findall в re модуль.Regex для выражения в выражениях с использованием модуля python re

Пример: str = "15/9 + -9/5"

Выход должен формы [("15","9","+","-9","5")]

я смог придумать это:

pattern = r'-?\d+|\s+\W\s+' 

print(re.findall(pattarn,str)) 

Который производит выход ["15","9"," + ","-9","5"]. Но после того, как я так долго возился с этим, я не могу получить это в 5-элементный кортеж, и я не могу сопоставить операцию, не совпадающую с белыми пространствами вокруг него.

+0

Не '[tuple ([" 15 "," 9 "," + "," -9 "," 5 "])]' yield '[(" 15 "," 9 "," + "," -9 "," 5 ")]'? Вам также нужно избавиться от пробелов? Если это так, '[tuple ([x.replace ('', '') для x в [" 15 "," 9 "," + "," -9 "," 5 "]])]' дает '' [(«15», «9», «+», «-9», «5»)] '. – dorverbin

ответ

0

Эта модель будет работать:

(-?\d+)\/(\d+)\s+([+\-*/])\s+(-?\d+)\/(\d+) 
#lets walk through it 
(-?\d+) #matches any group of digits that may or may not have a `-` sign to group 1 
     \/ #escape character to match `/` 
     (\d+) #matches any group of digits to group 2 
       \s+([+\-*/])\s+ #matches any '+,-,*,/' character and puts only that into group 3 (whitespace is not captured in group) 
           (-?\d+)\/(\d+) #exactly the same as group 1/2 for groups 4/5 

демо для этого:

>>> s = "15/9 + -9/5 6/12 * 2/3" 
>>> re.findall('(-?\d+)\/(\d+)\s([+\-*/])\s(-?\d+)\/(\d+)',s) 
[('15', '9', '+', '-9', '5'), ('6', '12', '*', '2', '3')] 
+0

Определенно сделал трюк! И какое прекрасное объяснение, чтобы согласиться с этим! Спасибо, я многому научился! – CodeSandwich

0

Общий способ разбивки строки, основанный на регулярном выражении это:

import re 

pattern = "\s*(\d+|[/+*-])" 

def tokens(x): 
    return [ m.group(1) for m in re.finditer(pattern, x) ] 

print tokens("9/4 + 6 ") 

Примечания:

  • Регулярное выражение начинается с \s*, чтобы передать все начальные пробелы.
  • Часть регулярного выражения, которая совпадает с маркером, заключена в parens для формирования захвата.
  • Различные шаблоны токенов находятся в захвате, разделенном операцией чередования |.
  • Будьте осторожны с использованием \W, так как это также будет соответствовать пробелу.