Python and Regular Expressions

Chris Rebert clp2 at rebertia.com
Wed Apr 7 04:52:14 EDT 2010


On Wed, Apr 7, 2010 at 1:37 AM, Richard Lamboj <richard.lamboj at bilcom.at> wrote:
> i want to parse this String:
>
> version 3.5.1 {
>
>        $pid_dir = /opt/samba-3.5.1/var/locks/
>        $bin_dir = /opt/samba-3.5.1/bin/
>
>        service smbd {
>                bin = ${bin_dir}smbd -D
>                pid = ${pid_dir}smbd.pid
>        }
>        service nmbd {
>                bin = ${bin_dir}nmbd -D
>                pid = ${pid_dir}nmbd.pid
>        }
>        service winbindd {
>                bin = ${bin_dir}winbindd -D
>                pid = ${pid_dir}winbindd.pid
>        }
> }
>
> version 3.2.14 {
>
>        $pid_dir = /opt/samba-3.5.1/var/locks/
>        $bin_dir = /opt/samba-3.5.1/bin/
>
>        service smbd {
>                bin = ${bin_dir}smbd -D
>                pid = ${pid_dir}smbd.pid
>        }
>        service nmbd {
>                bin = ${bin_dir}nmbd -D
>                pid = ${pid_dir}nmbd.pid
>        }
>        service winbindd {
>                bin = ${bin_dir}winbindd -D
>                pid = ${pid_dir}winbindd.pid
>        }
> }
>
> Step 1:
>
> version 3.2.14 {
>
>        $pid_dir = /opt/samba-3.5.1/var/locks/
>        $bin_dir = /opt/samba-3.5.1/bin/
>
>        service smbd {
>                bin = ${bin_dir}smbd -D
>                pid = ${pid_dir}smbd.pid
>        }
>        service nmbd {
>                bin = ${bin_dir}nmbd -D
>                pid = ${pid_dir}nmbd.pid
>        }
>        service winbindd {
>                bin = ${bin_dir}winbindd -D
>                pid = ${pid_dir}winbindd.pid
>        }
> }
>
> Step 2:
>        service smbd {
>                bin = ${bin_dir}smbd -D
>                pid = ${pid_dir}smbd.pid
>        }
> Step 3:
>        $pid_dir = /opt/samba-3.5.1/var/locks/
>        $bin_dir = /opt/samba-3.5.1/bin/
>
> Step 4:
>                bin = ${bin_dir}smbd -D
>                pid = ${pid_dir}smbd.pid
>
> My Regular Expressions:
> version[\s]*[\w\.]*[\s]*\{[\w\s\n\t\{\}=\$\.\-_\/]*\}
> service[\s]*[\w]*[\s]*\{([\n\s\w\=]*(\$\{[\w_]*\})*[\w\s\-=\.]*)*\}
>
> I think it was no good Solution. I'am trying with Groups:
> (service[\s\w]*)\{([\n\w\s=\$\-_\.]*)
> but this part makes Problems: ${bin_dir}

Regular expressions != Parsers

Every time someone tries to parse nested structures using regular
expressions, Jamie Zawinski kills a puppy.

Try using an *actual* parser, such as Pyparsing:
http://pyparsing.wikispaces.com/

Cheers,
Chris
--
Some people, when confronted with a problem, think:
"I know, I'll use regular expressions." Now they have two problems.
http://blog.rebertia.com


More information about the Python-list mailing list