Soy un principiante en expresiones regulares y estoy tratando de hacer una expresión para encontrar si hay dos dígitos iguales uno al lado del otro, y el dígito detrás y delante del par es diferente.
Por ejemplo,
123456678 debe coincidir ya que hay un doble 6,
1234566678 no debe coincidir ya que no hay ningún doble con diferentes números circundantes. 12334566 debe coincidir porque hay dos 3.
Hasta ahora tengo esto que funciona solo con 1, y siempre que el doble no esté al principio o al final de la cadena, sin embargo, puedo solucionarlo agregando una letra al principio y al final.
^.*([^1]11[^1]).*$
Sé que puedo usar [0-9]
en lugar de los 1, pero el problema es que todos tengan el mismo dígito.
¡Gracias!
Con expresiones regulares, es mucho más conveniente usar un módulo de expresiones regex
de PyPi con el patrón basado en (*SKIP)(*FAIL)
:
import regex rx = r'(\d)\1{2,}(*SKIP)(*F)|(\d)\2' l = ["123456678", "1234566678"] for s in l: print(s, bool(regex.search(rx, s)) )
Vea la demostración de Python . Producción:
123456678 True 1234566678 False
Detalles de expresiones regulares
(\d)\1{2,}(*SKIP)(*F)
- un dígito y luego dos o más ocurrencias del mismo dígito|
- o(\d)\2
- un dígito y luego el mismo dígito.El punto es hacer coincidir todos los fragmentos de 3 o más dígitos idénticos y omitirlos, y luego hacer coincidir un fragmento de dos dígitos idénticos.
También puede utilizar una forma sencilla.
import re l=["123456678", "1234566678", "12334566 "] for i in l: matches = re.findall(r"((.)\2+)", i) if any(len(x[0])!=2 for x in matches): print "{}-->{}".format(i, False) else: print "{}-->{}".format(i, True)
Puede personalizar esto según sus reglas.
Producción:
123456678-->True 1234566678-->False 12334566 -->True
Inspirado por la respuesta o Wiktor Stribiżew, otra variación de usar una alternancia con re
es comprobar la existencia del grupo de captura que contiene una coincidencia positiva para 2 de los mismos dígitos que no están rodeados por el mismo dígito.
En este caso, compruebe el grupo 3.
((\d)\2{2,})|\d(\d)\3(?!\3)\d
Demostración de expresiones regulares | demostración de Python
(
Grupo de captura 1(\d)\2{2,}
Capture el grupo 2 , haga coincidir 1 dígito y repita ese mismo dígito 2+ veces)
Cerrar grupo|
O\d(\d)
Coincide con un dígito, captura un dígito en el grupo 3\3(?!\3)\d
Coincide con el mismo dígito que en el grupo 3. Coincide con el 4º dígito, pero no debe ser el mismo que el dígito del grupo 3Por ejemplo
import re pattern = r"((\d)\2{2,})|\d(\d)\3(?!\3)\d" strings = ["123456678", "12334566", "12345654554888", "1221", "1234566678", "1222", "2221", "66", "122", "221", "111"] for s in strings: match = re.search(pattern, s) if match and match.group(3): print ("Match: " + match.string) else: print ("No match: " + s)
Producción
Match: 123456678 Match: 12334566 Match: 12345654554888 Match: 1221 No match: 1234566678 No match: 1222 No match: 2221 No match: 66 No match: 122 No match: 221 No match: 111
Si, por ejemplo, solo 2 o 3 dígitos también está bien para hacer coincidir, puede verificar el grupo 2
(\d)\1{2,}|(\d)\2