¿Las expresiones regulares de Python soportan algo como Perl’s \ G?

Tengo una expresión regular de Perl (que se muestra aquí , aunque no es de esperar que sea necesario comprender todo esto para responder esta pregunta) que contiene el metacarácter \ G. Me gustaría traducirlo a Python, pero Python no parece ser compatible con \ G. ¿Que puedo hacer?

Prueba estos:

import re re.sub() re.findall() re.finditer() 

por ejemplo:

 # Finds all words of length 3 or 4 s = "the quick brown fox jumped over the lazy dogs." print re.findall(r'\b\w{3,4}\b', s) # prints ['the','fox','over','the','lazy','dogs'] 

Python no tiene el modificador / g para su regexen, por lo que no tiene el token de expresión regular \ G. Una pena, de verdad.

Puede usar re.match para hacer coincidir los patrones anclados. re.match solo coincidirá al principio (posición 0) del texto, o donde especifique.

 def match_sequence(pattern,text,pos=0): pat = re.compile(pattern) match = pat.match(text,pos) while match: yield match if match.end() == pos: break # infinite loop otherwise pos = match.end() match = pat.match(text,pos) 

Esto solo coincidirá con el patrón de la posición dada, y cualquier coincidencia que siga a 0 caracteres después.

 >>> for match in match_sequence(r'[^\W\d]+|\d+',"he11o world!"): ... print match.group() ... he 11 o 

Sé que llego un poco tarde, pero aquí hay una alternativa al enfoque \G :

 import re def replace(match): if match.group(0)[0] == '/': return match.group(0) else: return '<' + match.group(0) + '>' source = '''http://a.com http://b.com //http://etc.''' pattern = re.compile(r'(?m)^//.*$|http://\S+') result = re.sub(pattern, replace, source) print(result) 

salida (a través de Ideone ):

   //http://etc. 

La idea es utilizar una expresión regular que coincida con ambos tipos de cadena: una URL o una línea comentada. Luego, utiliza una callback (delegado, cierre, código incrustado, etc.) para averiguar con cuál coincidió y devolver la cadena de reemplazo adecuada.

De hecho, este es mi enfoque preferido incluso en versiones que admiten \G Incluso en Java, donde tengo que escribir un montón de código repetitivo para implementar la callback.

(No soy un chico de Python, así que perdóname si el código es terriblemente antipónico).

No intente poner todo en una expresión, ya que se vuelve muy difícil de leer, traducir (como usted ve por sí mismo) y mantener.

 import re lines = [re.sub(r'http://[^\s]+', r'<\g<0>>', line) for line in text_block.splitlines() if not line.startedwith('//')] print '\n'.join(lines) 

Python no suele ser mejor cuando traduces literalmente desde Perl, tiene sus propios patrones de progtwigción.