regulares - re python
expresiones regulares: grupo de caracteres coincidentes o final de lĂnea (4)
¿Cómo se relacionan ^
(inicio de línea) y $
(final de línea) en un []
(grupo de caracteres)?
ejemplo simple
zazty
cuerda: zazty
reglas:
- coincide con cualquier "z" o "y"
- si precedido por
- una "a", "b"; o
- al comienzo de la línea.
pase: empareja los dos primeros "z"
Una expresión regular que funcionaría es:
(?:^|[aAbB])([zZyY])
Pero sigo pensando que sería mucho más limpio con algo así que significaba principio / final de línea dentro del grupo de personajes.
[^aAbB]([zZyY])
(en ese ejemplo se supone que ^
significa principio de línea, y no lo que realmente está ahí, un negativo para el grupo de caracteres)
Nota: utilizando python. pero sabiendo que en bash y vim sería bueno también.
Actualización: lea nuevamente el manual que dice para el conjunto de caracteres, todo pierde su significado especial, excepto las clases de caracteres (por ejemplo, /w
)
abajo en la lista de clases de caracteres, hay /A
para el principio de la línea, pero esto no funciona [/AaAbB]([zZyY])
¿Alguna idea de por qué?
¿Por qué no intentar el carácter de escape? ( [/^/$]
)
ACTUALIZACIÓN: Si desea encontrar todas las Z y As precedidas por "a", puede utilizar la apariencia positiva. Probablemente no haya manera de especificar comodines en los grupos de caracteres (porque los comodines también son caracteres). (Lo hay, me encantaría saberlo).
private static final Pattern PATTERN = Pattern.compile("(?<=(?:^|[aA]))([zZyY])");
public static void main(String[] args) {
Matcher matcher = PATTERN.matcher("zazty");
while(matcher.find()) {
System.out.println("matcher.group(0) = " + matcher.group(0));
System.out.println("matcher.start() = " + matcher.start());
}
}
Salida:
matcher.group(0) = z
matcher.start() = 0
matcher.group(0) = z
matcher.start() = 2
Concatene el carácter ''a'' al principio de la cadena. Luego use [aAbB]([zZyY])
.
No puede hacer coincidir un ^
o $
dentro de un []
porque los únicos caracteres con un significado especial dentro de una clase de caracteres son ^
(como en "todo menos") y -
(como en "rango") (y las clases de caracteres). /A
y /Z
simplemente no cuentan como clases de caracteres.
Esto es para todos los sabores (estándar) de expresiones regulares, así que estás atascado con (^|[stuff])
y ($|[stuff])
(que en realidad no son tan malas).
Prueba este:
(?<![^abAB])([yzYZ])