On Dec 8, 1:22 am, r0g <aioe....@technicalbloke.com> wrote:
> Torsten Mohr wrote:
> > Hi,
>
> > i'd like to test if an input string starts with a python expression
> > and also where that expression ends.  An example:
>
> > a_func(3*7, '''abc''') +5 pls some more
>
> > The first part until (inclusive) the 5 should be found as an expression
> > and the length of that string should also be detected.
>
> > Background is that i want to embed some python expressions in a text
> > and i want to evaluate them later.
> > It is possible that the embedded expressions span several lines.
>
> > Alternatively, is it possible to define a start- and an end-marker
> > that define the embedded expression and find the expression using
> > a regular expression?
>
> That's the easy way and will work for most cases if you use uncommon
> delimiters. I tend to use '<<<' and '>>>' for things like this but you
> can make them as obscure as you like.
>
> > If the expression contains strings, these strings could contain
> > the end-marker which should not be found inside strings.
>
> You could build in escaping but that complicates things quite quickly,
> assuming this is for your own private use and you won't be dealing with
> huge rafts of data from elsewhere or using this to control radiotherapy
> machines etc, that's probably overkill.
>
> The re module should do everything you need and is part of the standard lib.
>
> >>> import re
> >>> regex = re.compile(r'<<<(.{1,500}?)>>>', re.DOTALL)
> >>> regex.findall("the cat <<<sat>>> on the <<<mat>>>")
>
> ['sat', 'mat']
>
> Hope this helps,
>
> Roger.

Use the parser module.

>>> parser.expr('func(a+1)')
<parser.st object at ...>

>>> parser.expr('print a')
...
SyntaxError: invalid syntax

Quite intensive as you have to compile every initial substring to find
the longest one but at least you use Python's own definition of an
expression.

Chard.
-- 
http://mail.python.org/mailman/listinfo/python-list

Reply via email to