Python-декоратор для предварительной обработки аргументов функции

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

s = " a & b | c & d "
l = map(lambda x : map(lambda x:x.strip() , x.strip().split('&')), s.strip().split('|'))

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

вот мое текущее решение, но оно не работает!

Обновить:

query_AND =lambda wl:  '.*'+'.*'.join(wl)+'.*'

def d_query_AND(query_split):
    def d_query_AND_f(query_split):
        return query_AND(query_split)
        #return query_spli
    return d_query_AND_f


@d_query_AND
def query_split(p):
    return [v for v in p.split('&')]


print query_split("asd & asdsa & sadsa")

1 ответ

Должен признать, я не до конца понимаю, зачем тебе нужен декоратор.

Один из относительно простых способов токенизации этих выражений - использование регулярного выражения:

In [12]: re.findall(r'[^|&\s]+|&|[|]', ' a & b | c & d ')
Out[12]: ['a', '&', 'b', '|', 'c', '&', 'd']

In [13]: re.findall(r'[^|&\s]+|&|[|]', 'asdasd&sdasd| asdsa & asdsda')
Out[13]: ['asdasd', '&', 'sdasd', '|', 'asdsa', '&', 'asdsda']

Регулярное выражение состоит из трех компонентов ИЛИ-ed вместе:

  • [^|&\s]+ соответствует последовательности символов, отличных от &, | и пробелы.
  • & Матчи &,
  • [|] Матчи |,

Если вам не нужно захватывать операторы, регулярное выражение можно упростить до r'[^|&\s]+',

edit: если вы не хотите разделять пробелы, как вы подразумеваете в комментариях, должно работать следующее:

In [18]: map(string.strip, re.findall(r'[^|&]+|&|[|]', 'asdasd&sd  asd| asdsa & asdsda'))
Out[18]: ['asdasd', '&', 'sd  asd', '|', 'asdsa', '&', 'asdsda']
Другие вопросы по тегам