I am -1 on the whole idea.<div><br></div><div>However, for the sake of argument, I'll say that if it was done I would not bind the callbacks at match time.</div><div><br></div><div>Instead, they would be part of the compiled regex objects.</div>

<div><br></div><div>r = re.compile(r"foo:(?C<check_bounds>\d+)", check_bounds=lambda d: 1 <= int(d) <= 100)</div><div><br></div><div>and then r could be used like any other regex, and you don't need to know about the callbacks when actually using it, just to build it.</div>

<div><br><div class="gmail_quote">On Sat, Mar 19, 2011 at 12:19 PM, MRAB <span dir="ltr"><<a href="mailto:python@mrabarnett.plus.com">python@mrabarnett.plus.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">

<div class="im">On 19/03/2011 11:33, Peter Otten wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
MRAB wrote:<br>
<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
Some of those who are relative new to regexes sometimes ask how to write<br>
a regex which checks that a number is in a range or is a valid date.<br>
Although this may be possible, it certainly isn't easy.<br>
<br>
  From what I've read, Perl has a way of including code in a regex, but I<br>
don't think that's a good idea<br>
<br>
However, it occurs to me that there may be a case for being able to call<br>
a supplied function to perform such checking.<br>
<br>
Borrowing some syntax from Perl, it could look like this:<br>
<br>
      def range_check(m):<br>
          return 1<= int(m.group())<= 10<br>
<br>
      numbers = regex.findall(r"\b\d+\b(*CALL)", text, call=range_check)<br>
<br>
The regex module would match as normal until the "(*CALL)", at which<br>
point it would call the function. If the function returns True, the<br>
matching continues (and succeeds); if the function returns False, the<br>
matching backtracks (and fails).<br>
</blockquote>
<br>
I would approach that with<br>
<br>
numbers = (int(m.group()) for m in re.finditer(r"\b\d+\b"))<br>
numbers = [n for n in numbers if 1<= n<= 10]<br>
<br>
here. This is of similar complexity, but has the advantage that you can use<br>
the building blocks throughout your python scripts. Could you give an<br>
example where the benefits of the proposed syntax stand out more?<br>
<br>
</blockquote></div>
There may be a use case in config files where you define rules (for<br>
example, Apache <FilesMatch>) or web forms where you have validation,<br>
but a regex is too limited. This would enable you to add 'richer'<br>
checking. There could be a predefined set of checks, such as whether a<br>
date is valid.<div class="im"><br>
<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
The function would be passed a match object.<br>
<br>
An extension, again borrowing the syntax from Perl, could include a tag<br>
like this:<br>
<br>
      numbers = regex.findall(r"\b\d+\b(*CALL:RANGE)", text,<br>
call=range_check)<br>
<br>
The tag would be passed to the function so that it could support<br>
multiple checks.<br>
</blockquote>
<br>
[brainstorm mode]<br>
Could the same be achieved without new regex syntax? I'm thinking of reusing<br>
named groups:<br>
<br>
re.findall(r"\b(?P<number>\d+)\b", text,<br>
            number=lambda s: 1<= int(s)<= 10)<br>
<br>
</blockquote></div>
I'm not sure about that.<div><div></div><div class="h5"><br>
_______________________________________________<br>
Python-ideas mailing list<br>
<a href="mailto:Python-ideas@python.org" target="_blank">Python-ideas@python.org</a><br>
<a href="http://mail.python.org/mailman/listinfo/python-ideas" target="_blank">http://mail.python.org/mailman/listinfo/python-ideas</a><br>
</div></div></blockquote></div><br><br clear="all"><br>-- <br>Read my blog! I depend on your acceptance of my opinion! I am interesting!<br><a href="http://techblog.ironfroggy.com/">http://techblog.ironfroggy.com/</a><br>

Follow me if you're into that sort of thing: <a href="http://www.twitter.com/ironfroggy">http://www.twitter.com/ironfroggy</a><br>
</div>