假设我有一个包含多行的文件,例如:
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感到困惑。
答案 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
将匹配任何不是空格的内容,所以只有在有东西的情况下你才会得到匹配除了空格。