Python 通配符匹配
我有一个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。