此代码的问题是..
a = '1111.222.333'
b = a.split('.')
first = b[0]
second = b[1]
third = b[2]
是。。如果字符串缺少诸如..之类的片段
a = '222.333'
the "second" can end up becoming "first"
我想确保字符串是..
111.222.333
格式。换句话说,有2个点分隔3个字符串
更新:
第一个和第二个总是数字,最后一个总是"测试"文本。。
换句话说:111.22.测试
但也许这是另一个问题。
一种解决方案可能是使用regex:
import re
a = '1111.222.333'
def does_string_match(a):
return re.match('d+.d+.test', a) is not None
print does_string_match(a) # returns True
模式d+.d+.test
当前匹配于:
d+ 1 or more numeric digits
. A literal period
d+ 1 or more numeric digits
. A literal period
test The literal text 'test'
如果字符串的格式始终为num.num.test
,那么如果需要,您可能不使用regex来执行测试。您可以按句点拆分字符串,检查结果列表的长度,然后独立检查每个组件。如果长度不是3,或者任何组件都是你不接受的值,那么你就知道出了问题。
def does_string_match(a):
try:
# If you can't unpack a.split into 3 pieces, Python throws a ValueError
first, second, third = a.split('.')
# If you can't convert first or second to ints, Python throws a ValueError
int(first)
int(second)
if third != 'test':
return False
except ValueError:
return False
return True
您可以将str.split
与try
/except
块一起使用,例如:
s = '1111.222.333'
try:
first, second, third = s.split('.', 2)
except ValueError:
# do something suitable
在这里,我们只在.
上拆分两次,如果没有足够的参数来进行解包,那么就会抛出ValueError
异常,然后您可以适当地处理它,否则您将分配first
、second
和third
,并准备就绪。
如果不希望有三个以上的参数,则去掉str.split()
的第二个参数。except
块仍将运行,您可以根据需要进行处理。
a = '1111.222.333'
b = a.split('.')
if len(b) != 3:
print('Houston we have a problem.')
else:
try:
int(b[0]), int(b[1])
except ValueError:
print('First two really should be digits!')
first = b[0]
second = b[1]
third = b[2]
请注意,这既适用于点过少的情况,也适用于点过多的情况。