我是python的新手,所以显然也不熟悉使用正则表达式。我只是好奇,如果有可能看到一个数字之前输入的其他数字在一个字符串?
这个函数(def checkzero)应该做的是检查是否在另一个数字之前输入0,如果是,则返回True(对于无效)
import string
import re
plate_pattern = re.compile('D*d*')
def main():
plate = input("Plate: ")
tests = [exclusions, platecheck, checkzero]
invalid = any(test(plate) for test in tests)
if invalid:
print("Invalid nNo numbers in the start/middle of the plate, first number may not be 0. nNo punctuation allowed.nPlate must be between 2-6 characters.")
else:
print("Valid")
def exclusions(s):
if any(c in string.punctuation for c in s):
return True
return len(s) > 6 or len(s) < 2
def platecheck(s):
return not plate_pattern.fullmatch(s)
def checkzero(s):
# Not sure how to go about creating the function to check if zero is inputted before other numbers.
pass
main()
输入/输出示例:
输入:
test02
输出:
Invalid
...
输入:
test20
输出:
Valid
所以为了简单起见,我们只是检查,如果一个数字在给定字符串中首次出现是0
或不是。
import re
def checkzero(s):
return re.search(r'd', s).group() == '0'
测试:
test_cases = ['test0', 'test02', 'test20', 'test002', 'test2022']
for test_case in test_cases:
print(checkzero(test_case))
输出:
>>> True
>>> True
>>> False
>>> True
>>> False
对评论的回复
任意点的第一个数不能为0
您可以从字符串^
的开头查看非数字字符[^d]*
,然后可能是0,然后是数字.*d?
,然后从那里进行相同的操作(也更新了测试用例):
def checkzero(s):
p = re.compile(r"^[^d]*0.*d?")
matched = re.search(p, s)
return re.search(p, s) != None
test_cases = ["test0", "test1", "test01", "test10", "test101"]
for test in test_cases:
print(test, end = ": ")
if checkzero(test):
print("Matched, INVALID")
else:
print("Not matched, VALID")```
输出:
test0: Matched, INVALID
test1: Not matched, VALID
test01: Matched, INVALID
test10: Not matched, VALID
test101: Not matched, VALID
原始文章
你可以用re.search()
。如果找到匹配,则返回Match
对象,否则返回None
。
def checkzero(s):
p = re.compile(r"0.*d")
matched = re.search(p, s)
return re.search(p, s) != None
注意:如果您希望0后面紧跟着一个数字,请删除正则表达式
中的.*
。