[Tutor] shlex parsing

Karim karim.liateni at free.fr
Thu Jul 28 02:43:27 CEST 2011


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


More information about the Tutor mailing list