2012-01-11 8 views
22

De pydoc:Por qué no ignoreCase bandera (re.I) trabajan en re.sub()

re.sub = sub (patrón, repl, cuerda, count = 0, banderas = 0)
Devuelve la cadena obtenida reemplazando las apariciones no superpuestas del patrón en cadena por la sustitución sustituta. repl puede ser una cadena o un llamable; si se procesa una cadena, la barra invertida escapa en ella. Si es un invocable, se pasa el objeto de coincidencia y debe devolver una cadena de reemplazo que se utilizará.

ejemplo de código:

import re 
print re.sub('class', 'function', 'Class object', re.I) 

Sin sustitución se hace a menos que cambie el patrón de 'clase'.

La documentación no menciona nada sobre esta limitación, así que supongo que puedo estar haciendo algo mal.

¿Cuál es el caso aquí?

Respuesta

43

Me parece que usted debe hacer:

import re 
print re.sub('class', 'function', 'Class object', flags=re.I) 

Sin esto, el argumento re.I se pasa al argumento count.

+0

Ah, tienes razón. Me perdí el requisito de argumento. Me acostumbré a colocar banderas después del objeto cadena, como en el re principal. funciones, así que no presté demasiada atención a las llamadas de argumento. Gracias – theta

7

El argumento flags es la quinta uno - que está pasando el valor de re.I como el count argumento (un error fácil de hacer).

3

Nota para aquellos que todavía se ocupan de las instalaciones de Python 2.6.x o anteriores. Python documentation for 2.6 re dice:

re.sub(pattern, repl, string[, count]) 

re.compile(pattern[, flags]) 

Esto significa que no se puede pasar directamente a la sub banderas. Solo se pueden usar con compilación:

regex = re.compile('class', re.I) 
regex.sub("function", "Class object") 
0

Solo para agregar a la respuesta de Seppo. De acuerdo con http://docs.python.org/2.6/library/re.html, todavía hay una manera de pasar banderas directamente a 'sub' en 2.6 que podría ser útil si tiene que hacer un código 2.7 con muchos subcompatibles compatibles con 2.6. Para citar el manual:

... si necesita especificar indicadores de expresiones regulares, debe usar un objeto RE o usar modificadores incrustados en un patrón; por ejemplo, sub ("(? i) b +", "x", "BBBB BBBB") devuelve 'xx'

y

(? iLmsux) (una o más letras de la set 'i', 'L', 'm', 's', 'u', 'x'.) El grupo coincide con la cadena vacía; las letras establecen las banderas correspondientes: re.I (caso de ignorar), re.L (dependiente de la localidad), re.M (multilínea), re.S (punto coincide con todas), re.U (dependiente de Unicode) y re.X (verboso), para toda la expresión regular. (Los indicadores se describen en Contenidos del módulo). Esto es útil si desea incluir los indicadores como parte de la expresión regular, en lugar de pasar un argumento de indicador a la función re.compile().

En la práctica, esto significa

print re.sub("class", "function", "Class object", flags= re.IGNORECASE)

puede reescribirse usando modificadores (? M) como

print re.sub("(?i)class", "function", "Class object")

1

Para evitar errores de este tipo, los siguientes parches mono se puede utilizar:

import re 
re.sub = lambda pattern, repl, string, *, count=0, flags=0, _fun=re.sub: \ 
    _fun(pattern, repl, string, count=count, flags=flags) 

(*) se prohíbe especificar count, flags como argumentos posicionales. _fun=re.sub es el uso de la declaración de tiempo de re.sub)

Demostración:.

$ python 
Python 3.4.2 (default, Oct 8 2014, 10:45:20) 
[GCC 4.9.1] on linux 
Type "help", "copyright", "credits" or "license" for more information. 
>>> import re 
>>> re.sub(r'\b or \b', ',', 'or x', re.X) 
'or x' # ?! 
>>> re.sub = lambda pattern, repl, string, *, count=0, flags=0, _fun=re.sub: \ 
...  _fun(pattern, repl, string, count=count, flags=flags) 
>>> re.sub(r'\b or \b', ',', 'or x', re.X) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: <lambda>() takes 3 positional arguments but 4 were given 
>>> re.sub(r'\b or \b', ',', 'or x', flags=re.X) 
', x' 
>>> 
Cuestiones relacionadas