我原来的问题是我需要剥离一个字符串,然后由操作员分割。
s = " a & b | c & d "
l = map(lambda x : map(lambda x:x.strip() , x.strip().split('&')), s.strip().split('|'))
这对人们来说太麻烦了,所以我想用decorator来做这个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")
答案 0 :(得分:0)
我不得不承认我不完全理解为什么你需要装饰师。
一种相对简单的标记化这些表达式的方法是使用正则表达式:
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']
正则表达式由三个OR-ed组成:
[^|&\s]+
匹配&
,|
和空格以外的字符序列。&
匹配&
。[|]
匹配|
。如果您不需要捕获运算符,则可以将正则表达式简化为r'[^|&\s]+'
。
编辑:如果您不希望拆分空格,正如您在评论中所暗示的那样,以下内容应该有效:
In [18]: map(string.strip, re.findall(r'[^|&]+|&|[|]', 'asdasd&sd asd| asdsa & asdsda'))
Out[18]: ['asdasd', '&', 'sd asd', '|', 'asdsa', '&', 'asdsda']