The LBYL version is not necessarily as performant as the EAFP version, so saying that throwing exceptions is "expensive in terms of performance" is categorically false. It really depends on the type of strings you're processing:
In [33]: def lbyl(lines):
...: for line in lines:
...: if line.find(":") != -1:
...: # Nuke the parens, do tuple unpacking like an idiomatic Python dev.
...: role, lineSpoken = line.split(":",1)
...: # no print, since output is obnoxiously long with %timeit
...:
In [34]: def eafp(lines):
...: for line in lines:
...: try:
...: # Nuke the parens, do tuple unpacking like an idiomatic Python dev.
...: role, lineSpoken = eachLine.split(":",1)
...: # no print, since output is obnoxiously long with %timeit
...: except:
...: pass
...:
In [35]: lines = ["abc:def", "onetwothree", "xyz:hij"]
In [36]: %timeit lbyl(lines)
100000 loops, best of 3: 1.96 µs per loop
In [37]: %timeit eafp(lines)
100000 loops, best of 3: 4.02 µs per loop
In [38]: lines = ["a"*100000 + ":" + "b", "onetwothree", "abconetwothree"*100]
In [39]: %timeit lbyl(lines)
10000 loops, best of 3: 119 µs per loop
In [40]: %timeit eafp(lines)
100000 loops, best of 3: 4.2 µs per loop