He leído todas las publicaciones relacionadas y he rastreado Internet, pero esto realmente me está golpeando.¿Cómo hago que el aspecto negativo de Python sea menos codicioso?
Tengo un texto que contiene una fecha.
Me gustaría capturar la fecha, pero no si está precedida por una cierta frase.
Una solución directa es agregar un aspecto negativo detrás de mi RegEx.
Aquí hay algunos ejemplos (usando findall).
Solo quiero capturar la fecha si no está precedida por la frase "a partir de".
19-2-11
algo algo 15-4-11
tal y como de 29-5-11
Aquí está mi expresión regular:
(?<!as of)(\d{1,2}-\d{1,2}-\d{2})
Resultados esperados:
['19 -2-11 ']
['15 -4-11']
[]
Los resultados reales:
['19 -2-11' ]
['15 -4-11 ']
[' 9/5/11' ]
en cuenta que es 9 no 29. Si cambio \d{1,2}
a algo sólido como \d{2}
en el primer patrón :
bad regex for testing: (?<!as of)(\d{2}-\d{1,2}-\d{2})
Luego recibo los resultados esperados. Por supuesto, esto no es bueno porque me gustaría combinar días de 2 dígitos y días de un solo dígito.
Aparentemente mi mirada negativa detrás es quity codiciosa - más que mi captura de fecha, por lo que está robando un dígito de ella y está fallando. Intenté todos los medios para corregir la avaricia que se me ocurre, pero no sé cómo arreglar esto.
Me gustaría que mi captura de fecha coincida con la mayor codicia, y luego se aplicará mi mirada negativa detrás. es posible? Mi problema parecía ser un buen uso de imágenes negativas y no demasiado complicado. Estoy seguro de que podría lograrlo de otra manera si es necesario, pero me gustaría aprender cómo hacerlo.
¿Cómo hago que el aspecto negativo de Python sea menos codicioso?
Esto es fantástico, encuentro '(?:^| \ S +)' y su explicación es muy clara. Siento que mi pregunta es respondida.:) Puramente por el conocimiento y no por la necesidad, me gustaría aprender a modificar esto para que el '\ s' sea opcional, de modo que' algo algo15-4-11' coincida, pero puedo ser capaz de entenderlo yo mismo. ¡Gracias! –
@ChristopherGalpin Creo que se puede lograr muy fácilmente usando '*' (de 0 a infinito) en lugar de '+' (de 1 a infinito) en esta parte del patrón: '(?:^| \ S +) ' – ovgolovin
Tenía la esperanza de que fuera tan fácil, pero evidentemente no, rompe el emparejamiento' de 'de la misma manera que la pregunta original. –