2011-08-03 24 views

Respuesta

160

usted tiene que construir la expresión regular como una cadena:

TEXTO = sys.argv[1] 
my_regex = r"\b(?=\w)" + re.escape(TEXTO) + r"\b(?!\w)" 

if re.search(my_regex, subject, re.IGNORECASE): 
    etc. 

Nota el uso de re.escape de manera que si el texto tiene caracteres especiales, no van a ser interpretado como tal.

+12

+1 para hacer referencia a re.escape, ¡antes no lo había notado en los documentos! – bdeniker

+2

¿Qué pasa si su variable va primero? 'r '' + foo + 'bar''? – deed02392

+0

@ deed02392 'r''' no es necesario si haces' re.escape (foo) ', que de todos modos deberías. En realidad, creo que 're' interpreta todo lo que se da como una cadena Unicode independientemente de si prefieres' r' o no. – OJFord

19
rx = r'\b(?<=\w){0}\b(?!\w)'.format(TEXTO) 
+0

1 desde la interpolación de cadenas va a desaparecer. – Chris

+3

:-) Dudo que la interpolación de cuerdas desaparezca alguna vez ... –

+1

@phasetwenty: No, no lo es. Me gusta más el formato, pero los desarrolladores centrales de Python no planean eliminar la vieja sintaxis de printf. –

32
if re.search(r"\b(?<=\w)%s\b(?!\w)" % TEXTO, subject, re.IGNORECASE): 

Esto insertará lo que está en TEXTO en la expresión regular como una cadena.

1

Estoy de acuerdo con todo lo anterior a menos que:

sys.argv[1] era algo así como Chicken\d{2}-\d{2}An\s*important\s*anchor

sys.argv[1] = "Chicken\d{2}-\d{2}An\s*important\s*anchor" 

que no desea utilizar re.escape, porque en ese caso le gustaría que se comporte como una expresión regular

TEXTO = sys.argv[1] 

if re.search(r"\b(?<=\w)" + TEXTO + "\b(?!\w)", subject, re.IGNORECASE): 
    # Successful match 
else: 
    # Match attempt failed 
1

Necesitaba buscar nombres de usuario que fueran similares entre sí, y lo que Ned Batchelder dijo estaba en creíblemente útil. Sin embargo, me encontré con que tenía la producción más limpia cuando utilicé re.compile para crear mi término de búsqueda re:

pattern = re.compile(r"("+username+".*):(.*?):(.*?):(.*?):(.*)" 
matches = re.findall(pattern, lines) 

de salida se puede imprimir utilizando la siguiente:

print(matches[1]) # prints one whole matching line (in this case, the first line) 
print(matches[1][3]) # prints the fourth character group (established with the parentheses in the regex statement) of the first line. 
1

Me resulta muy conveniente para construir un patrón de expresión regular al unir múltiples patrones más pequeños.

import re 

string = "begin:id1:tag:middl:id2:tag:id3:end" 
re_str1 = r'(?<=(\S{5})):' 
re_str2 = r'(id\d+):(?=tag:)' 
re_pattern = re.compile(re_str1 + re_str2) 
match = re_pattern.findall(string) 
print(match) 

Salida:

[('begin', 'id1'), ('middl', 'id2')] 
Cuestiones relacionadas