expresiones regulares (vim) para imprimir … para imprimir (…) para python2 a python3

Esta publicación es útil solo si tiene cadenas dentro del comando de impresión. Ahora tengo toneladas de código fuente con una statement como

print milk,butter 

que debe ser formateado para

 print(milk,butter) 

Y capturar el final de la línea con \ n no fue exitoso. ¿Alguna pista?

No estoy familiarizado con 2to3, pero de todos los comentarios, parece la herramienta correcta para el trabajo.

Dicho esto, tal vez podamos usar esta pregunta como una excusa para una breve lección sobre algunos conceptos básicos.

Primero, quieres un patrón que coincida con las líneas correctas. Creo que ^\s*print\> hará:

  • ^ coincide con el inicio de línea (y $ coincide con el final de línea).
  • \s coincide con el espacio en blanco (espacio o tabulador)
  • * significa 0 o más del átomo anterior (tantos como sea posible, o “codicioso”).
  • print es una cadena literal.
  • \> coincide con el final de la palabra (ancho cero). Puede usar un espacio (literal) o \s\+ lugar.

A continuación, debe identificar la parte que se incluirá entre paréntesis. Como * es codicioso,. .* Coincidirá con el final de la línea; No hay necesidad de anclarlo a la derecha. Use \(\s*print\) y \(.*\) Para capturar las piezas, de modo que pueda referirse a ellas como \1 y \2 en el reemplazo.

Ahora, pon las piezas juntas. Hay muchas variantes, y no he intentado “jugar golf” en este:

 :%s/^\(\s*print\)\s\+\(.*\)/\1(\2) 

Algunas personas prefieren la versión “muy mágica”, donde solo az, AZ, 0-9 y _ se tratan como caracteres literales; entonces no necesitas escapar de los paréntesis ni el más:

 :%s/^\v(\s*print)\s+(.*)/\1(\2) 

Podría usar 2to3 y solo aplicar la corrección para la statement de impresión -> función de impresión.

 2to3 --fix=print [yourfiles] 

Esto debería manejar automáticamente todos esos casos extraños que no funcionarán con, por ejemplo, una expresión regular vim.

Si le falta el 2to3 shell 2to3 por alguna razón, ejecute lib como un módulo:

 python -m lib2to3 --fix=print [yourfiles] 

Ya que estas en vim ya

 :!2to3 --fix=print --write %