我正在尝试检查一个单词是否有一个尾随的分号。我在一个长字符串中有该单词的位置,我想检查start of word + length of word
位置的字符是否为:
。可能是单词是字符串中的最后一个单词,因此尝试获取下一个字符将会引发IndexException
我有三个想法:
1)检查我们是否在字符串的末尾,然后检查它是否不是分号
semicolon_pos = pos_word + len(word) # Possible position
if semicolon_pos < len(long_string) and long_string[semicolon_pos] == ':':
# do something...
else:
# do something else
不是通常被认为是pythonic的
2)尝试 - 除分号提取和分号相等
semicolon_pos = pos_word + len(word) # Possible position
try:
if long_string[semicolon_pos] == ':':
# Do something
else:
# do something else (which is the same as in the except clause)
except IndexError:
# do something else
看起来有点奇怪,提取然后嵌套。我必须做一个小技巧来避免代码重复
3)尝试 - 除了分号提取和断言以确保它是分号
semicolon_pos = pos_word + len(word) # Possible position
try:
assert long_string[semicolon_pos] == ':'
# do something
except (IndexError, AssertionError):
# do something else
结构更平坦且易于阅读,但我有一种滥用异常使用的感觉。
蟒蛇人说什么? 提前谢谢。
答案 0 :(得分:3)
绝对滥用断言。原因:当使用-O
标志运行代码时,甚至不会执行断言。
使用断言的推荐方法是检查由算法中的错误(后置条件)导致的“不可能”条件。对于前置条件和程序逻辑,应该使用普通的例外。
答案 1 :(得分:2)
(string[index] if index < len(string) else None) == ':'
答案 2 :(得分:1)
我认为这样更容易:
#considering mylongstring contains the word
#+1 for the possible colon
mylongstring[:pos_word + len(word) + 1].endswith(':')
或者,如果长字符串很长,你不想复制太多:
mylongstring[pos_word:pos_word + len(word) + 1][-1] == ':'
答案 3 :(得分:1)
最简单的方法是使用切片作为下标。切片不会抛出IndexError:
semicolon_pos = pos_word + len(word) # Possible position
if long_string[semicolon_pos:semicolon_pos+1] == ':':
# Do something
else:
# do something else