I don't think we should support incomplete or incorrect version strings, or make this function so advanced. This should only be used internally by Picard. If we allow passing strings like "1.0" to this, it just allows us to write vague/inconsistent code.

```
def version_from_string(version_string):
    num = lambda x: int(x) if unicode(x).isnumeric() else x
    return tuple(map(num, re.findall(r"(\d+|dev|final)", version_string)))
```