Dado un archivo de texto, donde el carácter que quiero hacer coincidir está delimitado por comillas simples, pero podría tener cero o un único escape cita, así como cero o más pestañas y caracteres de nueva línea (no escapó) - Quiero hacer coincidir solo el texto. Ejemplo:Python regex para hacer coincidir el texto entre comillas simples, ignorando las comillas escapadas (y pestañas/líneas nuevas)
menu_item = 'casserole';
menu_item = 'meat
loaf';
menu_item = 'Tony\'s magic pizza';
menu_item = 'hamburger';
menu_item = 'Dave\'s famous pizza';
menu_item = 'Dave\'s lesser-known
gyro';
Quiero agarrar sólo el texto (y espacios), haciendo caso omiso de las pestañas/saltos de línea - y que en realidad no importa si la cita escapado aparece en los resultados, siempre y cuando no lo hace afectará al partido:
casserole
meat loaf
Tonys magic pizza
hamburger
Daves famous pizza
Dave\'s lesser-known gyro # quote is okay if necessary.
tengo gestionar para crear una expresión regular que casi lo hacen - que maneja las cotizaciones escapado, pero no los saltos de línea:
menuPat = r"menu_item = \'(.*)(\\\')?(\t|\n)*(.*)\'"
for line in inFP.readlines():
m = re.search(menuPat, line)
if m is not None:
print m.group()
Definitivamente hay un montón de preguntas sobre expresiones regulares, pero la mayoría usa Perl, y si hay una que hace lo que quiero, no pude entenderlo :) Y como estoy usando Python, no lo hago cuidado si se extiende a través de múltiples grupos, es fácil recombinarlos.
Algunas respuestas han dicho simplemente ir con el código para analizar el texto. Aunque estoy seguro de que podría hacer eso - estoy tan cerrar para tener una expresión regular activa :) Y parece que debería ser factible.
Actualización: Me acabo de dar cuenta de que estoy haciendo un Python readlines() para obtener cada línea, lo que obviamente está dividiendo las líneas que pasan a la expresión regular. Estoy buscando volver a escribirlo, pero cualquier sugerencia sobre esa parte también sería muy útil.
posible duplicado de [expresiones regulares para la gestión de caracteres de escape para elementos como literales de cadenas] (http://stackoverflow.com/questions/430759/regex-for-managing-escaped-characters-for-items-like-string-literals) – phooji
No está duplicado, estoy tratando de manejar (nuevas escapadas) rompiendo mis datos de entrada, también. –
Estoy de acuerdo, pero pensé que valía la pena señalar de todos modos. Simplemente use 're.MULTILINE' (http://docs.python.org/library/re.html#re.MULTILINE) para unir líneas múltiples,' $ 'para ignorar/unir líneas de finalización, y' \ s' (mismo enlace) para que coincida con el espacio de noticias. Adelante, saltamontes;) – phooji