2015-07-12 3 views
1

Мои операторы: =, >=, <=, >, <
И мое выражение так просто, как следующие образцы:Как разделить оператор и операнды в питоне

string1 = string2 
string1=string2 
string1= string2 
string1 =string2 
string1>=string2 
string1 >=string2 
string1 >= string2 
string1 <string2 
... 

мне нужно разделить любого из приведенные выше выражения в три слова и получить список, заполненный операторами и операндом. например

['string1', '>=', 'string2'] 

Я попытался использовать re.split, но не получил подходящего результата. Любой совет будет принят во внимание.

ответ

2

Вы можете попробовать:

re.split('(\W+)', 'string1 >=string2') 

Обратите внимание, что окружающие \W+ с скобкой будет держать в буквальном смысле вы разделив согласно.

Если вы хотите быть конкретным и разделяться только на заданные строки, вы можете составить их список и построить регулярное выражение с |, разделяющим каждый.

+0

спасибо. Он возвращает '['string1', '> =', 'string2']'. Можно ли получить '['string1', '> =', 'string2']' (обрезанные слова)? – Meysam

+0

@Meysam '[x.strip ('') для x в re.split ...]' – Maroun

+0

@Meysam или вы можете использовать 'map (str.strip, re.split ('(\ W +)', 'string1 > = string2 ')) ' – GHajba

3

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

import re 
lst = ['string1 = string2', 
    'string1=string2', 
    'string1= string2', 
    'string1 =string2', 
    'string1>=string2', 
    'string1 >=string2', 
    'string1 >= string2', 
    'string1 <string2'] 
pat = re.compile(r'(\w+)\s*([<>=]{1,2})\s*(\w+)') 
for e in lst : 
    matches = pat.search(e) 
    print matches.group(1), matches.group(2), matches.group(3) 

выход:

string1 = string2 
string1 = string2 
string1 = string2 
string1 = string2 
string1 >= string2 
string1 >= string2 
string1 >= string2 
string1 < string2 
+1

Ваше регулярное выражение также будет соответствовать 'string1 << string2' и' string1 <> string2', которые содержат нелегальные операторы. – martineau

+1

Это более строгое: 'pat = re.compile (r '(\ w +) \ s * (= | <=|> = | <|>) \ s * (\ w +)')' –

+0

Спасибо за комментарии. Я предположил, что входные данные действительны. Во всяком случае, более строгим является регулярное выражение, тем лучше. –

1

Вы можете использовать re.findall.

>>> import re 
>>> s = "string1>=string2" 
>>> re.findall(r'\w+|[^\s\w]+', s) 
['string1', '>=', 'string2'] 
>>> re.findall(r'\w+|[^\s\w]+', 'string1 = string2') 
['string1', '=', 'string2'] 
>>> re.findall(r'\w+|[^\s\w]+', 'string1 >= string2') 
['string1', '>=', 'string2'] 
>>> re.findall(r'\w+|[^\s\w]+', 'string1 <string2') 
['string1', '<', 'string2'] 
Смежные вопросы