¿Cómo usar una variable dentro de una expresión regular?

Me gustaría usar una variable dentro de una regex , ¿cómo puedo hacer esto en Python ?

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

Tienes 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. 

Tenga en cuenta el uso de re.escape para que si su texto tiene caracteres especiales, no se interpretarán como tales.

 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.

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

Me parece muy conveniente construir un patrón de expresión regular al juntar varios 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')] 

Estoy de acuerdo con todo lo anterior a menos que:

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

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

no querría usar re.escape , porque en ese caso le gustaría que se comportara 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 

Necesitaba buscar nombres de usuario que fueran similares entre sí, y lo que Ned Batchelder dijo fue increíblemente útil. Sin embargo, descubrí que tenía una salida más limpia cuando usé re.compile para crear mi término de búsqueda:

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

La salida se puede imprimir usando lo 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. 

También puede usar la palabra clave de formato para esto. El método de formato reemplazará el marcador de posición {} a la variable que pasó al método de formato como argumento.

 if re.search(r"\b(?=\w)**{}**\b(?!\w)".**format(TEXTO)**, subject, re.IGNORECASE): # Successful match**strong text** else: # Match attempt failed