Python通配符匹配

时间:2012-02-05 18:01:33

标签: python wildcard

我有一个python脚本,使用这样的模式获取输入: 1 **然后在那之后接受多个输入,如100,110,011等。 我需要测试以确定插补数据是否与模式匹配,*可以代表1或0.这样做的最佳方法是什么?我对Python很新,所以解释会有所帮助。

更新:添加了输入和输出示例

正确输入和输出的示例:

输入: ** 1(图案) 001,101,000 输出: 001,101

3 个答案:

答案 0 :(得分:3)

我建议使用输入字符串和replace生成一个简单的正则表达式:

>>> '1**0*'.replace('*', '[01]')
'1[01][01]0[01]'

现在可以以任何你想要的方式使用它:

>>> import re
>>> pattern = '1**0*'.replace('*', '[01]')
>>> bool(re.match(pattern, '00000'))
False
>>> bool(re.match(pattern, '10000'))
True

如果您不熟悉正则表达式,则可能需要阅读tutorial或两个。但基本思想是允许括号中的任何一个字符。因此,[01]可以匹配1或0,正如您在问题中所要求的那样。

答案 1 :(得分:1)

我使用zip代替正则表达式。它排列了两个字符串的所有元素,让你循环遍历每一对。

def verify(pat, inp):
  for n,h in zip(pat, inp):
      if n == '*':
          if h not in ('0', '1'):
            return False
      elif h not in ('0', '1'):
          return False
      elif n != h:
          return False
  return True
# Example use:
>>> verify('**1', '001')
True
>>> verify('**1', '101')
True
>>> verify('**1', '000')
False

@DSM采用较短的方式。

def verify(n, h):
    return all(c0 == c1 or (c0 == '*' and c1 in '01') for c0, c1 in zip(n, h))

# or even shorter
verify = lambda n,h:  all(c0 == c1 or (c0 == '*' and c1 in '01') for c0, c1 in zip(n, h))

答案 2 :(得分:0)

正则表达式可以匹配您描述的输入:

import re
yourinput = "100";
matchObj = re.match( r'(1..', yourinput)

点可能就是你对你的明星所描述的。

有很多教程,例如描述您可以使用匹配对象执行的操作,请在此处http://www.tutorialspoint.com/python/python_reg_expressions.htm查看教程或此处查看库文档http://docs.python.org/library/re.html