On 07/28/2011 02:27 AM, Steven D'Aprano wrote:
Karim wrote:

Hello All,

I would like to parse this TCL command line with shlex:

'-option1 [get_rule A1 B2] -option2 $VAR -option3 TAG'

And I want to get the splitted list:

['-option1', '[get_rule A1 B2]', '-option2', '$VAR', '-option3', 'TAG']

Then I will gather in tuple 2 by 2 the arguments.

I tried to the shlec properties attributes 'quotes', 'whitespace', etc...

I don't understand what you are doing here. Please show the code you use.

The shlex module doesn't support bracketed expressions. I recommend you write a post-processor. Start with doing this:

>>> import shlex
>>> text = '-option1 [get_rule A1 B2] -option2 $VAR -option3 TAG'
>>> shlex.split(text)
['-option1', '[get_rule', 'A1', 'B2]', '-option2', '$VAR', '-option3', 'TAG']

then take that list and reassemble the pieces starting with '[' until ']' Something like this, untested:


def reassemble(items):
    result = []
    bracketed = False
    current = ''
    for item in items:
        if item.startswith('['):
            bracketed = True
        if bracketed:
            current += item
            if item.endswith(']'):
                bracketed = False
                result.append(current)
                current = ''
        else:
             result.append(item)
    return result




Yes Steven this is the kind of code I wrote in a post earlier, but I forget to reinit as you did current equal to _token in my code, thanks for that for showing me to simply if/elif/elif/else levels:

Previous code was:

"I ended up with this and gave up with shlex:"

split = ['-option1', '[get_rule', 'A1', 'B2]', '-option2', '$VAR', '-option3', 'TAG']

procedure_found = False
result          = []

for token in split:
if not token.startswith('[') and not token.endswith(']') and not procedure_found:
        result.append(token)
    elif token.startswith('['):
        procedure_found = True
        _token = token
    elif token.endswith(']'):
        procedure_found = False
        _token += ' ' + token
        result.append(_token)
    else:
        _token += ' ' + token

print split
print result

But I make 'choux blanc'.

I don't know what that means.
This means 'white cabbage' in french = 'unsuccessful try'

Cheers
Karim
_______________________________________________
Tutor maillist  -  Tutor@python.org
To unsubscribe or change subscription options:
http://mail.python.org/mailman/listinfo/tutor

Reply via email to