• Jobs
  • About Us
  • professionals
    • Home
    • Jobs
    • Courses and challenges
    • Questions
    • Teachers
  • business
    • Home
    • Post vacancy
    • Our process
    • Pricing
    • Assessments
    • Payroll
    • Blog
    • Sales
    • Salary Calculator

0

229
Views
expresión regular para encontrar un par de dígitos adyacentes con diferentes dígitos alrededor de ellos

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!

about 3 years ago · Santiago Trujillo
3 answers
Answer question

0

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.

Vea la demostración de expresiones regulares .

about 3 years ago · Santiago Trujillo Report

0

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
about 3 years ago · Santiago Trujillo Report

0

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 3

Por 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

demostración de Python

about 3 years ago · Santiago Trujillo Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Our process Sales
Legal
Terms and conditions Privacy policy
© 2025 PeakU Inc. All Rights Reserved.

Andres GPT

Recommend me some offers
I have an error