Regex para la existencia de algunas palabras cuyo orden no importa

Me gustaría escribir una expresión regular para buscar la existencia de algunas palabras, pero su orden de aparición no importa.

Por ejemplo, busca “Tim” y “estúpido”. Mi expresión regular es Tim.*stupid|stupid.*Tim . Pero, ¿es posible escribir una expresión regular más simple (por ejemplo, para que las dos palabras aparezcan solo una vez en la expresión regular)?

Related of "Regex para la existencia de algunas palabras cuyo orden no importa"

Ver este regex:

 /^(?=.*Tim)(?=.*stupid).+/ 

Explicación de Regex:

  • ^ Afirma la posición al comienzo de la cadena.
  • (?=.*Tim) Afirma que “Tim” está presente en la cadena.
  • (?=.*stupid) Afirma que “stupid” está presente en la cadena.
  • .+ Ahora que nuestras frases están presentes, esta cadena es válida. Continúe y use .+ O – .++ para hacer coincidir toda la cadena.

Para usar Lookaheads más exclusivamente, puede agregar otro grupo (?=.*) . La expresión regular completa se puede simplificar como /^(?=.*Tim).*stupid/ .

Ver una demostración de expresiones regulares !

 >>> import re >>> str =""" ... Tim is so stupid. ... stupid Tim! ... Tim foobar barfoo. ... Where is Tim?""" >>> m = re.findall(r'^(?=.*Tim)(?=.*stupid).+$', str, re.MULTILINE) >>> m ['Tim is so stupid.', 'stupid Tim!'] >>> m = re.findall(r'^(?=.*Tim).*stupid', str, re.MULTILINE) >>> m ['Tim is so stupid.', 'stupid Tim!'] 

Lee mas:

  • Regex con caracteres de exclusión y otro regex

Puedes usar Positive Lookahead para lograr esto. El enfoque de búsqueda anticipada es bueno para hacer coincidir cadenas que contienen ambas subcadenas, independientemente del orden.

 pattern = re.compile(r'^(?=.*Tim)(?=.*stupid).*$') 

Ejemplo :

 >>> s = '''Hey there stupid, hey there Tim Hi Tim, this is stupid Hi Tim, this is great''' ... >>> import re >>> pattern = re.compile(r'^(?=.*Tim)(?=.*stupid).*$', re.M) >>> pattern.findall(s) # ['Hey there stupid, hey there Tim', 'Hi Tim, this is stupid']