Números de filtro Regex divisibles por 3

Tengo una lista de identificadores (dígitos) separados por comas. Y necesito obtener solo estos que son divisibles por 3.

Example: i = "3454353, 4354353, 345352, 2343242, 2343242 ..."

preguntado el 12 de junio de 12 a las 08:06

regex es útil para hacer coincidir patrones con cadenas. No para hacer matemáticas. Sería mucho más fácil simplemente dividir su cadena por comas y luego filtrar la lista resultante en la condición divisible por 3. -

Publique más información, como un ejemplo de entrada y salida. -

No probé nada porque no pude encontrar nada.

seguro que esta esta etiquetada regex solo por error, sin embargo, sería interesante encontrar una solución de expresiones regulares, si existe. -

4 Respuestas

Sólo por el gusto de hacerlo:

reobj = re.compile(
    r"""\b            # Start of number
    (?:               # Either match...
     [0369]+          # a string of digits 0369
    |                 # or
     [147]            # 1, 4 or 7
     (?:              # followed by
      [0369]*[147]    # optional 0369s and one 1, 4 or 7
      [0369]*[258]    # optional 0369s and one 2, 4 or 8
     )*               # zero or more times,
     (?:              # followed by
      [0369]*[258]    # optional 0369s and exactly one 2, 5 or 8
     |                # or
      [0369]*[147]    # two more 1s, 4s or 7s, with optional 0369s in-between.
      [0369]*[147]
     )
    |                 # or the same thing, just the other way around,
     [258]            # this time starting with a 2, 5 or 8
     (?:
      [0369]*[258]
      [0369]*[147]
     )*
     (?:
      [0369]*[147]
     |
      [0369]*[258]
      [0369]*[258]
     )
    )+                # Repeat this as needed
    \b                # until the end of the number.""", 
    re.VERBOSE)
result = reobj.findall(subject)

encontrará todos los números en una cadena que son divisibles por 3.

Respondido el 12 de junio de 12 a las 09:06

esa es una respuesta más precisa, gracias de nuevo, @Tim Pietzcker, ¿podría proporcionarnos un poco de información sobre cómo funciona? - Martin

@Martin: Espero que no vayas a usar eso en el código de producción. Regex no es la herramienta adecuada para esto, incluso si funciona. Esto es terriblemente ineficiente. - Tim Pietzcker

He visto uno que parece funcionar (spoiler, supongo): rubular.com/r/ZcRDblHg8M - Kobi

Un DFA se convierte a la expresión regular un poco más simple ([0369]|([147][0369]*[258])|(([258]|[147][0369]*[147])([0369]*|[258][0369]*[147])([147]|[258][0369]*[258])))*: tinyurl.com/7trrs5j - Paul

@MichaelBoger: No, no es así. Compruébalo en regex101.com/r/ipsFSQ/1 - Tim Pietzcker

Si realmente quieres decir dígitos (¿No estás registrado como números), esto es tan fácil como

 re.findall(r'[369]', my_str)

Para una lista de números, es bastante fácil sin expresiones regulares:

lst = "55,62,12,72,55"
print [x for x in lst.split(',') if int(x) % 3 == 0]

Respondido el 12 de junio de 12 a las 08:06

¿El cero no pertenece allí? - eumiro

+1 a thg435 para la respuesta y eumiro ya que 0 es divisible por cualquier número entero distinto de cero. - Paul

También es posible que deba dividir en , (espacio de coma), no solo , según la edición reciente de la pregunta. - Paul

@Martin, probablemente no deberías usar "10x", al menos math.stackexchange.com, a menos que quiera confundir a la gente. - Qimpuesto

@Martin: una sugerencia: por mucho que amo las expresiones regulares, y lo hago, esta es definitivamente la mejor respuesta, y debe aceptarla si puede evitar una expresión regular. - Kobi

Usando la idea de esta pregunta yo obtengo:

i = "1, 2, 3, 4, 5, 6, 60, 61, 3454353, 4354353, 345352, 2343241, 2343243"

for value in i.split(','):
    result = re.search('^(1(01*0)*1|0)+$', bin(int(value))[2:])
    if result:
        print '{} is divisible by 3'.format(value)

Pero no desea utilizar expresiones regulares para esta tarea.

contestado el 23 de mayo de 17 a las 12:05

Una versión con suerte completa, de la reducción de DEA[1]:

^([0369]|[147][0369]*[258]|(([258]|[147][0369]*[147])([0369]|[258][0369]*[147])*([147]|[258][0369]*[258])))+$

[1:] Conversión de autómatas finitos deterministas en expresiones regulares', C. Neumann 2005
NOTA: Hay un error tipográfico en la Fig.4: la transición de q_i a sí mismo debe leer ce*b en lugar de ce*d.

Respondido 25 Oct 21, 09:10

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.