Estoy tratando de crear una expresión regular para que coincida con un subconjunto de la sintaxis de indexación avanzada numpy de Python para matrices 1D.
Hasta ahora tengo esto:
^[_a-zA-Z]\w*\s*\[\s*\[(\s*[-+]?\s*[1-9][0-9]*\s*,\s*)*\]\s*\]$
Esta expresión regular puede coincidir con éxito con lo siguiente:
a[[10,]]
a[[+10,-10,20,]]
a [ [ + 10 , - 10 , 20 , ] ]
a[[]]
Sin embargo, la coma final en las listas de Python es opcional y no es obligatoria. Desafortunadamente, mi expresión regular no puede validar lo siguiente:
a[[10]]
a[[10,10]]
Tenga en cuenta la coma que falta al final de los corchetes internos. Si agrego un ?
al lado del ,
de mi patrón regex, entonces el patrón anterior se valida. Sin embargo, la expresión regular también valida elementos que son expresiones numéricas (por ejemplo,: a[[10+10,10]]
) que no es deseable.
Lo que esencialmente quiero es tener una lista de números enteros, entre corchetes internos, separados por comas y permitir una coma final. Además, estos números pueden tener un prefijo -
o +
.
¿Alguien puede proporcionarme una solución que valide el patrón descrito anteriormente?
Gracias.
3 respuestas
Puede modificar su expresión regular para permitir un número opcional no seguido de una coma antes del cierre ]
:
^[_a-zA-Z]\w*\s*\[\s*\[(\s*[-+]?\s*[1-9][0-9]*\s*,\s*)*(\s*[-+]?\s*[1-9][0-9]*\s*)?\]\s*\]$
Hay que mezclar lo opcional con lo requerido de forma precisa.
^[_a-zA-Z]\w*\s*\[\s*\[(?:\s*(?:[-+]\s*)?[1-9][0-9]*(?:\s*,\s*(?:[-+]\s*)?[1-9][0-9]*)*(?:\s*,)?\s*)?\]\s*\]$
https://regex101.com/r/D3wzYb/1
Expandida
^
[_a-zA-Z]
\w* \s* \[ \s* \[
(?:
\s*
(?: [-+] \s* )?
[1-9] [0-9]*
(?:
\s* , \s*
(?: [-+] \s* )?
[1-9] [0-9]*
)*
(?: \s* , )?
\s*
)?
\] \s* \]
$
Tal vez,
(?i)(?!.*\d\s*[+*%-]\s*\d)^[a-z_]\w*\s*\[\s*\[(\s*[-+]?\s*[1-9][0-9]*\s*,?\s*)*\]\s*\]$
Haría entonces.
Demo
Aquí, fallaríamos esas operaciones no deseadas usando alguna subexpresión como,
(?!.*\d\s*[+*%-]\s*\d)
Y lo incluiríamos al comienzo de nuestra expresión, por ejemplo.
Preguntas relacionadas
Nuevas preguntas
python
Python es un lenguaje de programación multipropósito, de tipificación dinámica y de múltiples paradigmas. Está diseñado para ser rápido de aprender, comprender y usar, y hacer cumplir una sintaxis limpia y uniforme. Tenga en cuenta que Python 2 está oficialmente fuera de soporte a partir del 01-01-2020. Aún así, para preguntas de Python específicas de la versión, agregue la etiqueta [python-2.7] o [python-3.x]. Cuando utilice una variante de Python (por ejemplo, Jython, PyPy) o una biblioteca (por ejemplo, Pandas y NumPy), inclúyala en las etiquetas.