[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