Python:确保字符串完全是A.B.C格式.(两个点分隔3个字符串)



此代码的问题是..

 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.splittry/except块一起使用,例如:

s = '1111.222.333'
try:
    first, second, third = s.split('.', 2)
except ValueError:
    # do something suitable

在这里,我们只在.上拆分两次,如果没有足够的参数来进行解包,那么就会抛出ValueError异常,然后您可以适当地处理它,否则您将分配firstsecondthird,并准备就绪。

如果不希望有三个以上的参数,则去掉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]

请注意,这既适用于点过少的情况,也适用于点过多的情况。

最新更新