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.

2
AstrOne 29 sep. 2019 a las 04:21

3 respuestas

La mejor respuesta

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*\]$

Demostración en regex101

1
Nick 29 sep. 2019 a las 01:42

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* \] 
 $
3
x15 29 sep. 2019 a las 03:23

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.

1
Emma 29 sep. 2019 a las 01:48
58151471