Tengo un motor de plantillas de Python que usa mucho regexp. Utiliza la concatenación como:
re.compile( regexp1 + "|" + regexp2 + "*|" + regexp3 + "+" )
Puedo modificar las subcadenas individuales (regexp1, regexp2, etc.).
¿Hay alguna expresión pequeña y ligera que no coincida con nada, que pueda usar dentro de una plantilla en la que no quiero coincidencias? Desafortunadamente, a veces se agrega '+' o '*' al átomo de expresiones regulares, por lo que no puedo usar una cadena vacía, lo que generará un error de "nada que repetir".
Respuestas:
Esto no debería coincidir con nada:
re.compile('$^')
Entonces, si reemplaza regexp1, regexp2 y regexp3 con '$ ^', será imposible encontrar una coincidencia. A menos que esté utilizando el modo multilínea.
Después de algunas pruebas encontré una mejor solución.
re.compile('a^')
Es imposible de igualar y fallará antes que la solución anterior. Puede reemplazar a con cualquier otro carácter y siempre será imposible hacer coincidir
fuente
QtCore.QRegExp
. Tan malo, ya que seguramente habría sido más ligero de ejecutar.(?!)
siempre debe fallar en coincidir. Es la anticipación negativa de ancho cero. Si lo que está entre paréntesis coincide, toda la coincidencia falla. Dado que no tiene nada, fallará la coincidencia por cualquier cosa (incluido nada).fuente
Para hacer coincidir una cadena vacía, incluso en modo multilínea, puede usar
\A\Z
, entonces:re.compile('\A\Z|\A\Z*|\A\Z+')
La diferencia es que
\A
y\Z
son el inicio y el final de la cadena , mientras que^
y$
estos pueden coincidir con el inicio / final de las líneas , por lo que$^|$^*|$^+
podrían coincidir con una cadena que contiene nuevas líneas (si la bandera está habilitada).Y para no coincidir con nada (incluso una cadena vacía), simplemente intente encontrar contenido antes del inicio de la cadena, por ejemplo:
re.compile('.\A|.\A*|.\A+')
Dado que ningún carácter puede aparecer antes de \ A (por definición), esto siempre fallará en coincidir.
fuente
'.{0}'
¿ Quizás ?fuente
Puede usar
\z..
Este es el final absoluto de la cadena, seguido de dos de cualquier cosa
Si
+
o*
está tachado al final, esto todavía funciona negándose a coincidir con nadafuente
\z
no permite el seguimiento de nuevas líneas, a diferencia\Z
, ¿no será suficiente con una? O esta es una defensa extraña contra*
(¿por qué te estás protegiendo contra eso?)O use un poco de comprensión de la lista para eliminar las entradas de expresiones regulares inútiles y únase para juntarlas todas. Algo como:
re.compile('|'.join([x for x in [regexp1, regexp2, ...] if x != None]))
Sin embargo, asegúrese de agregar algunos comentarios junto a esa línea de código :-)
fuente