2017-07-18 144 views
0

如果通配符搜索为真,我希望有bool。具体而言,如果存在以下情况:_<any number or char>_字符之间的通配符匹配

理想情况下,我想找到一种优雅的pythonic方式。例如,对于完全匹配,any返回true。有通配符的等价物吗?

>>> lst = ['cherry', 'pineapple_1', 'apple', '_olive', 'banana_split_1'] 
>>> any('_.' in elem for elem in lst) 
False 
>>> any('_' in elem for elem in lst) 
True 
>>> any('_*_' in elem for elem in lst) 
False 

为了澄清,所述第二命令应返回含有两个下划线之间的字符'banana_split_1'元件的True B/C。

+3

你用'regex'标记了这个问题,这是一个明显的解决方案;使用正则表达式有什么问题? – Prune

+0

@Prune,是的,我认为解决方案将包含're',但我很难建立表达式。此外,我想看看在完全匹配的情况下是否还有其他类似于“任何”的方法。 –

+0

这些比赛的关键是'in',而不是'any' ......并且're'是工具。 – Prune

回答

2

您可以随时使用str.find(),它很可能是最快的这样一个简单的模式,也:

>>> lst = ['cherry', 'pineapple_1', 'apple', '_olive', 'banana_split_1'] 
>>> any(x.find('_', x.find('_') + 2) != -1 for x in lst) 
True 

编辑 - 说明:它通过循环的lst的每一个元素,并试图找到一个下划线后面跟着另一个下划线,只要它们之间至少有一个字符。考虑解开它用于单个情况:

>>> test = 'banana_split_1' 
>>> index = test.find('_') # 6, the index of the first underscore 
>>> index2 = test.find('_', index + 2) # 12, the index of the next underscore 
>>> index2 != -1 
True 

如果(因此它需要之间的至少一个字符由2位除去右侧)index2将是-1和测试在没有一个第二个下划线上述发生器会失败。

显然,这对于所有条目重复,直到找到匹配或any()返回False

+0

这适用于模式“_?_”(下划线之间的单个字符),但不适用于请求的情况“_ * _”(字母数字字符串),如示例中的“banana_split_1”。 – Prune

+0

你能解释一下解决方案吗? –

+0

@Prune - 这适用于两个下划线之间的任意数量的字符(> 1)。 – zwer

0

像这样的东西?

for elem in list: 
    if bool(re.search(expression, elem)): 
     return True 
return False 
0

我认为你需要的关键项是字母数字描述符,如_[0-9A-Za-z]+_

0-9 digits 
A-Z upper-case 
a-z lower-case 
[] any one of these characters 
+ at least one repetition (disallows null string) 

环绕在下划线,我相信这是你的搜索模式。

+0

谢谢,我会尝试。它可以工作。你会使用“搜索”还是“匹配”? –

+0

我打算把我的教师帽放在上面:看看[正则表达式中的教程}(https://docs.python.org/2/howto/regex.html)并学习*全部*(好,尽可能多你觉得今天吸收)你的基本知识。 – Prune