Números de filtro Regex divisibles por 3
Frecuentes
Visto 6,939 equipos
4 Respuestas
13
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
9
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
2
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
2
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 python regex or haz tu propia pregunta.
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. - Paul
Publique más información, como un ejemplo de entrada y salida. - jamylak
No probé nada porque no pude encontrar nada. Martin
Regex para hacer coincidir números binarios divisibles por 3 podría ser de interés. - Qtax
seguro que esta esta etiquetada
regex
solo por error, sin embargo, sería interesante encontrar una solución de expresiones regulares, si existe. - georg