【问题标题】:Python wildcard matchingPython通配符匹配
【发布时间】:2012-02-27 10:11:26
【问题描述】:

我有一个 python 脚本,它使用如下模式接受输入: 1** 然后接受多个输入,例如 100、110、011 等。 我需要测试估算的数据是否与模式匹配,* 可以代表 1 或 0。这样做的最佳方法是什么?我对 Python 很陌生,所以解释会很有帮助。

更新:添加输入输出示例

正确输入输出示例:

输入: **1(模式) 001, 101, 000 输出: 001, 101

【问题讨论】:

  • *s 转换成.s 并将它们视为正则表达式?
  • 如果你能举一个正确和错误输出的例子会很有帮助。

标签: python wildcard


【解决方案1】:

我建议使用输入字符串和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,正如您在问题中所要求的那样。

【讨论】:

    【解决方案2】:

    我会使用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))
    

    【讨论】:

    • all(c0 == c1 or (c0 == '*' and c1 in '01') for c0, c1 in zip(patt, x))? izip_longest 可以避免 '010' 匹配 '01',但不清楚 OP 是否想要。
    • 哦,谢谢。我什至没有想到不同的字符串长度。我会在答案中添加较短的版本。
    【解决方案3】:

    regex 可以匹配你描述的输入:

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

    圆点可能就是你用星号描述的。

    有很多教程,例如描述你可以用 matchobject 做什么,看这里 http://www.tutorialspoint.com/python/python_reg_expressions.htm 的教程或这里的库文档 http://docs.python.org/library/re.html

    【讨论】:

    • 这与 011 不匹配,后者是 OP 的示例有效输出之一。另外,我认为您缺少')'
    猜你喜欢
    • 1970-01-01
    • 2017-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-09
    • 1970-01-01
    相关资源
    最近更新 更多