Python 通配符匹配

4 投票
3 回答
5521 浏览
提问于 2025-04-17 12:23

我有一个Python脚本,它的输入格式是这样的:先输入一个模式,比如1**,然后再输入多个数据,比如100、110、011等等。我需要检查这些输入的数据是否符合这个模式,其中的*可以代表1或者0。请问有什么好的方法来实现这个功能?我对Python还比较陌生,所以希望能有详细的解释。

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

正确的输入和输出示例:

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

3 个回答

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

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))
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

如果你对正则表达式不太了解,可以看看一些教程。不过基本的概念是,方括号中的任何一个字符都是可以接受的。所以[01]可以匹配到你问题中提到的1或0。

撰写回答