<div dir="ltr">Hi all<div><br></div><div>I'd be interested in comments on a fluent regular expression generator I've been playing with (inspired by the frustrations of a friend of mine who's learning).</div><div>

<br></div><div>The general use case is to be able to construct RE strings such as:</div><div><br></div><div>r'^\(\d{3,3}\)-{1,1}\d{3,3}\-{1,1}\d{4,4}$' (intended to match North American phone number)<br></div><div>

<br></div><div>as:</div><div><br></div><div>from grimace import RE</div><div><div>north_american_number_re = (RE().start</div><div>                                    .literal('(').followed_by.exactly(3).digits.then.literal(')')</div>

<div>                                    .then.one.literal("-").then.exactly(3).digits</div><div>                                    .then.one.dash.followed_by.exactly(4).digits.then.end</div><div>                                    .as_string())</div>

</div><div><br></div><div>The intent is to provide clarity: since the strings would normally be generated and compiled when a module is first imported, there's minimal overhead.</div><div><br></div><div>It's on github at <a href="https://github.com/benlast/grimace">https://github.com/benlast/grimace</a> and the first blog post that explains it is here: <a href="http://benlast.livejournal.com/30871.html">http://benlast.livejournal.com/30871.html</a> (I've added to it since then).</div>

<div><br></div><div>Tests are the best explanation, and they're in the __init__ at the end so that they're self-executing if the init is executed.</div><div><br></div><div>I'm thinking about other features to implement, and more use cases would be welcome.</div>

<div><br></div><div>Cheers</div><div>ben</div><div><br></div></div>