[pyar] Trabado con una re

Matías Bellone matiasbellone en gmail.com
Lun Ago 15 12:43:04 ART 2011


2011/8/15 Jose Jachuf <jjachuf en gmail.com>:
> El día 15 de agosto de 2011 11:57, Matías Bellone
> <matiasbellone en gmail.com> escribió:
>> Tenés que modificar tu expresión regular para que sólo matchee la
>> comilla al final de la cadena sólo si el siguiente caracter no es otra
>> comilla. Dado que todas las cadenas están entre comillas, la expresión
>> regular más simple es:
>>
>>  ('(?:[^']|'')+')
>>
>> Eso es:
>> - una comilla
>> - seguida por una o más de alguna de las siguientes
>>   - cualquier cosa que no sea una comilla
>>   - dos comillas seguidas
>> - una comilla
>>
>>>>> a = "'O''HIGGINS GRAL. BERNARDO','8871','8899','8870','8898','ST','S','17459','8870','8871','8898','8899','0105000'"
>>>>> d = re.compile("('(?:[^']|'')+')")
>>>>> c = d.findall(a)
>>>>> c
>> ["'O''HIGGINS GRAL. BERNARDO'", "'8871'", "'8899'", "'8870'",
>> "'8898'", "'ST'", "'S'", "'17459'", "'8870'", "'8871'", "'8898'",
>> "'8899'", "'0105000'"]
>>
>> Si no querés las comillas en las cadenas resultantes, también se puede
>> hacer corriendo un poco los paréntesis:
>>
>>>>> d = re.compile("'((?:[^']|'')+)'")
>>>>> c = d.findall(a)
>>>>> c
>> ["O''HIGGINS GRAL. BERNARDO", '8871', '8899', '8870', '8898', 'ST',
>> 'S', '17459', '8870', '8871', '8898', '8899', '0105000']
>>
>> Saludos,
>> Toote
>
> Muchas Gracias Toote
>
> Funciona bien, salvo para cuando hay un valor numérico (sin comillas,
> 887), no lo encuentra.
>
> 'O''HIGGINS (GRAL.) BERNARDO', 887,
> '8899','8870','8898','ST','S','17459','8870','8871','8898','8899','0105000'
>

En ese caso la cosa se te complica un poco más. Me parece más
sencillo, sin embargo, extender la consulta anterior con este caso
particular: números que no están entre comillas:

('(?:[^']|'')+)'|(?:,\s*([0-9]+)\s*,)

Es decir que le decís que busque lo mismo que estaba buscando antes O
una coma, seguido por 0 o más espacios, una cadena de 1 o más números,
0 o más espacios y una coma.

>>> a = "'O''HIGGINS GRAL. BERNARDO', 8871,'8899','8870','8898','ST','S','17459','8870','8871','8898','8899','0105000'"
>>> d = re.compile("'((?:[^']|'')+)'|(?:,\s*([0-9]+)\s*,)")
>>> d.findall(a)
[("O''HIGGINS GRAL. BERNARDO", ''), ('', '8871'), ('8899', ''),
('8870', ''), ('8898', ''), ('ST', ''), ('S', ''), ('17459', ''),
('8870', ''), ('8871', ''), ('8898', ''), ('8899', ''), ('0105000',
'')]

El problema de esto es cómo te devuelve los datos. Como verás, te
devuelve una tupla en la que está uno o lo otro según corresponda.
Pero creo que podés "trabajar con eso"

Saludos,
Toote
-- 
Web: http://www.enespanol.com.ar



More information about the pyar mailing list