@jnm I may have found a way. If you use re.search (to start with), it finds the passage, regardless of the location, but if you use re.match, it expects it at the beginning of the string (substring, in this case ;)
@jnm that involves full "Hey! Check out John 1:2-3. I was reading it at 4:30 and it was great!" text processing (it would add John 4:30 to it). If you're only looking at discrete strings, it's not a problem. But pulling passages out of English text can be.
@jnm It was really just to make the code a bit more sane. But I have a real question for you, as one who uses this code: I think the best way to implement John 1:2-3,7-8 is to make the book name optional in the RE. Problem is, that'll break any parsing..
@jnm Okay, just gave you a pull request. Changes: Changed book to a dictionary so you don't need that silly book[ch-1] business, just book[ch] (and len(book) still works. Also added the so-called "deuterocanonical" books.