检查Python

时间:2015-08-28 17:35:03

标签: python parsing

假设我有一个包含多行的文件,例如:

getIPAddress(): 1231.124131.32
getTime(): 1:11
getYear(): 2015

我想在以下之后检查字符是否存在:我已经考虑过基于“:”拆分它,但是如果它是这样的话:

getYear(): 
getTime(): 1:11

如果我基于“:”拆分getYear()并尝试访问列表的第二个元素,它将返回null。我怎么能成功地处理这种情况?理想情况下,如果可能的话,不想使用try / catch。

现在,我有这样的事情:

                        newline = line.split(":",1)[1]

出于某种原因,即使冒号后面没有信息,也就像getYear():一样 这不会进入我的除IndexError案例之外。有谁知道为什么这有效?我对它如何不返回indexerror感到困惑。

5 个答案:

答案 0 :(得分:2)

在交互式会话中尝试并查看返回的内容:

>>> "foo:".split(":")
['foo', '']

只要冒号存在,line.split(":", 1)将始终返回一个双元素列表。只有完全省略它才会返回长度为1。

您正在寻找的一种方法是:

parts = line.split(":", 1)
if len(parts) >= 2 and parts[1]: # len can't actually exceed 2 but it's a good habit to check
    # characters are present after the first colon

或者,正如shx2指出的那样,分区 - 总是会给你一个三元素的响应,其中最后一个由第一个冒号后面的任何字符组成。

答案 1 :(得分:1)

如果您的字符串包含N个冒号,则将其分割为冒号将始终返回长度为N + 1的列表。一些"分裂"元素可能是空字符串,如您的情况。这可以区分像getYear()这样的字符串将getYear():这样的字符串拆分。

您可以检查tokens[1]的值是否为空,或使用partition(),然后检查它返回的第3个值。

答案 2 :(得分:0)

您可以使用正则表达式与匹配的组一起访问getSomething():后面的数据:

#!/usr/bin/env python3
# coding: utf-8

import re

preg = re.compile('^(?P<get_sth>.*):{1}\s{1}(?P<data>.*)$')

with open('foo.txt') as f:
    for line in f:
        m = preg.match(line)
        if m:
            print(m.group('get_sth'), m.group('data'))

foo.txt如下所示:

getIPAddress(): 1231.124131.32
getTime(): 1:11
getYear(): 2015

print语句给出的输出是:

getIPAddress() 1231.124131.32
getTime() 1:11
getYear() 2015

答案 3 :(得分:0)

您可以使用以下逻辑,这可能有所帮助。您可以使用一些库函数来检查任何字符。

myString = "Position of a character"
    len2 = myString.index(':')
    //Then check from len2+1 to the lenght of the string for any character.
    //if there is any character use it for processing, other wise ignore.

答案 4 :(得分:0)

split将拆分字符串,如果冒号后面没有任何内容,则返回列表中第二个元素的空字符串;如果存在空格字符,则返回带空格字符的字符串。

string1 = "something: "
string2 = "something:"
string3 = "something:\n"
string1.split(":")
Out: ['something', ' ']
string2.split(":")
Out: ['something', '']
string3.split(":")
Out: ['something', '\n']

您可以使用正则表达式检查冒号后面是否还有空白

import re
regex = re.compile(r':\s*\S')
def line_checker(text):
    if regex.search(text):
        return True
    else:
        return False
line_checker(string1)
Out: False
line_checker(string2)
Out: False
line_checker(string2)
Out: False
line_checker("something:  123.479")
Out: True

在这个正则表达式中,\s*将匹配冒号后面的0个或更多个空格字符,而\S将匹配任何不是空格的内容,所以只有在有东西的情况下你才会得到匹配除了空格。