我有一个python脚本,使用这样的模式获取输入: 1 **然后在那之后接受多个输入,如100,110,011等。 我需要测试以确定插补数据是否与模式匹配,*可以代表1或0.这样做的最佳方法是什么?我对Python很新,所以解释会有所帮助。
更新:添加了输入和输出示例
正确输入和输出的示例:
输入: ** 1(图案) 001,101,000 输出: 001,101
答案 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