Estoy tratando de dividir las oraciones en inglés correctamente, y se me ocurrió con la expresión regular profano a continuación:¿Por qué no es un patrón de ancho fijo?
(?<!\d|([A-Z]\.)|(\.[a-z]\.)|(\.\.\.)|etc\.|[Pp]rof\.|[Dd]r\.|[Mm]rs\.|[Mm]s\.|[Mm]z\.|[Mm]me\.)(?<=([\.!?])|(?<=([\.!?][\'\"])))[\s]+?(?=[\S])'
El problema es, Python mantiene elevando el siguiente error:
Traceback (most recent call last):
File "", line 1, in
File "sp.py", line 55, in analyze
self.sentences = re.split(god_awful_regex, self.inputstr.strip())
File "/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/re.py", line 165, in split
return _compile(pattern, 0).split(string, maxsplit)
File "/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/re.py", line 243, in _compile
raise error, v # invalid expression
sre_constants.error: look-behind requires fixed-width pattern
¿Por qué es esto no es una expresión regular válida de ancho fijo? No estoy usando ningún carácter repetitivo (* o +), solo |
EDITAR @Anomie resolvió el problema - gracias una tonelada! Desafortunadamente, no puedo hacer el nuevo equilibrio de expresión:
(?<!(\d))(?<![A-Z]\.)(?<!\.[a-z]\.)(?<!(\.\.\.))(?<!etc\.)(?<![Pp]rof\.)(?<![Dd]r\.)(?<![Mm]rs\.)(?<![Mm]s\.)(?<![Mm]z\.)(?<![Mm]me\.)(?:(?<=[\.!?])|(?<=[\.!?][\'\"\]))[\s]+?(?=[\S])
es lo que tengo ahora. El número de ('s coincide con el número de (' s, sin embargo:?
>>> god_awful_regex = r'''(?<!(\d))(?<![A-Z]\.)(?<!\.[a-z]\.)(?<!(\.\.\.))(?<!etc\.)(?<![Pp]rof\.)(?<![Dd]r\.)(?<![Mm]rs\.)(?<![Mm]s\.)(?<![Mm]z\.)(?<![Mm]me\.)(?:(?<=[\.!?])|(?<=[\.!?][\'\"\]))[\s]+?(?=[\S])'''
>>> god_awful_regex.count('(')
17
>>> god_awful_regex.count(')')
17
>>> god_awful_regex.count('[')
13
>>> god_awful_regex.count(']')
13
¿Alguna idea más
No tengo idea, pero quizás porque [Pp] rof = 4 caracteres mientras [Mm] rs = 3 caracteres? – orlp
Acerca del paréntesis desbalanceado: A simple vista, el problema parece ser que cerca del final de su expresión regular, ha escapado por error del corchete de cierre de una clase de caracteres, haciendo que los paréntesis de cierre sean parte de la clase en lugar de su función real . También ha escapado más de lo necesario en otros casos. Pruebe esto: 'r '' '(?
Además, es posible que desee simplificar su expresión regular haciendo que no distinga entre mayúsculas y minúsculas (compilarla con la opción 're.I'). –