Cool!  Can you take a first hack at implementing these changes and updating the tests?  The `-v` option could look like this:

```python
parser.add_argument(
        "-v", "--invert", action='store_true', default=False,
        help="Invert the sense of searching, to get lines that do not meet criteria.")
```
As a result, `args.invert` will be a boolean.  Grep uses `--invert-match`, but this might be confusing since we use `re.search`.
Thanks!