¡No se puede repetir el patrón negado usando \ @!

Aug 21 2020

Tengo este texto:

`` pitón
x = 1
''

Básicamente celdas de Python con rebajas. Me gustaría extraer el contenido de la celda que rodea al cursor, si corresponde.

Como ya habrás adivinado, estoy tratando de construir un flujo de trabajo jupyter, uso jupytex y vim-slime para la consola, y me gustaría enviar celdas a la consola.

Actualmente estoy luchando simplemente haciendo coincidir una celda con expresiones regulares:

/```python\(\(```\)\@!\)*```

Esto debe coincidir con una cadena que comience con `` `` python, luego todo excepto las comillas triples, luego las comillas triples, pero no es así.

Curiosamente, este (sin las comillas triples finales:

/```python\(\(```\)\@!\)*

destaca `` python, pero nada más.

Entonces, ¿cuál sería una expresión regular para que coincida con una celda de Python? ¡Bonificación por una expresión regular que coincida con el contenido de la celda debajo del cursor!

Respuestas

4 user938271 Aug 21 2020 at 03:18

Esto debe coincidir con una cadena que comience con `` `` python, luego todo excepto las comillas triples, luego las comillas triples, pero no es así.

Eso es porque el *multi no repite ningún carácter; simplemente repite una anticipación negativa, que no agrega nada a la coincidencia general. El motor de expresiones regulares no puede alcanzar las comillas triples de cierre.

/```python\(\(```\)\@!\)*```
            ^--------^
                ✘

Agrega un personaje adentro:

/```python\(\(```\)\@!\_.\)*```
                      ^-^

Tenga en cuenta que \_.puede coincidir con cualquier carácter, incluida una nueva línea; al contrario de lo .que no puede coincidir con una nueva línea. Ver :h /\_.


Entonces, ¿cuál sería una expresión regular para que coincida con una celda de Python? ¡Bonificación por una expresión regular que coincida con el contenido de la celda debajo del cursor!

Prueba esto:

```python\n\%(\%(```\)\@!\_.\)*\%#\_.\{-}\n```\n
                               ├─┘   ├──┘
                               │     └ as few as possible
                               └ the cursor position must match here

Ver :h /\%#y :h /\{-.

4 Quasímodo Aug 21 2020 at 03:27

No entiendo esas expresiones regulares avanzadas, pero esta debería funcionar:

^```python\_$\_.\{-}\_^```$

Para entenderlo, guíenos :help ordinary_atom:

  • \_$ coincide con el final de la línea.
  • \_. coincide con cualquier carácter, incluido el final de línea.
  • \_^ coincide con el inicio de la línea.

Y con :help non-greedy,

  • \{-}es el mismo que, *pero utiliza el algoritmo de primer coincidencia más corto. Recuerda que solo se aplica al elemento anterior, \_.en nuestro caso.

Es posible que desee relajar un poco la expresión regular, tal vez quitando ^y $anclando.

Probado en esta muestra, la expresión regular solo coincide con las celdas de Python.

This is Python:
```python
for i in range(10):
    print(i)
```
This is FORTRAN:
```fortran
DO I=1,10
    WRITE(*,*)I
ENDDO
```
This is Python again
```python
for i in range(10):
print('```')
```