Autor Tema: Expresiones regulares, mostrar exactamente números que contengan 3 dígitos  (Leído 4385 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado Daniel1952

  • PIC16
  • ***
  • Mensajes: 127
Un muy buen lunes para todos.
Lo que quiero obtener es lo siguiente, teniendo estos 5 números “316 4128 12 2174 223” que solo encuentre “316 y 223” probé poniendo
al final el signo $ y nada, espero deseen ayudarme, presiento que debe ser muy poco lo que me falta pero no lo logro, desde ya muchas gracias.- 

Código: Python
  1. import re
  2.  
  3. cadena = """01 - Roberto Daniel Virgili Ber. E. Lopez 2179 Arequito CP 2183
  4.            02 - Claudio Javier Scardino Jujuy 1315 Rosario CP 218
  5.         """
  6.  
  7. patron = r"[\d]{3}"
  8.  
  9. res = re.findall(patron, cadena)
  10.  
  11. print(res)
abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor y cuando lo abrazas dejan de causar dolor.-

Desconectado Picuino

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 5892
    • Picuino
Re:Expresiones regulares, mostrar exactamente números que contengan 3 dígitos
« Respuesta #1 en: 15 de Noviembre de 2021, 13:38:11 »
Prueba añadiendo espacios al comienzo y al final de la cadena y luego pidiendo que se capturen también:


Código: Python
  1. import re
  2.  
  3. cadena = " 316 4128 12 2174 223 "
  4.  
  5. patron = r" \d{3} "
  6.  
  7. res = re.findall(patron, cadena)
  8.  
  9. print(res)


Resultado:
Código: [Seleccionar]
[' 316 ', ' 223 ']

Desconectado Picuino

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 5892
    • Picuino
Re:Expresiones regulares, mostrar exactamente números que contengan 3 dígitos
« Respuesta #2 en: 15 de Noviembre de 2021, 13:45:44 »
Si quieres que no aparezcan los espacios se puede hacer un poco más complejo:


Código: Python
  1. import re
  2.  
  3. cadena = " 316 4128 12 2174 223 "
  4.  
  5. patron = r"(?<= )\d{3}(?= )"
  6.  
  7. res = re.findall(patron, cadena)
  8.  
  9. print(res)


Resultado:
Código: [Seleccionar]
['316', '223']

Desconectado Daniel1952

  • PIC16
  • ***
  • Mensajes: 127
Re:Expresiones regulares, mostrar exactamente números que contengan 3 dígitos
« Respuesta #3 en: 15 de Noviembre de 2021, 17:07:28 »
Prueba añadiendo espacios al comienzo y al final de la cadena y luego pidiendo que se capturen también:


Código: Python
  1. import re
  2.  
  3. cadena = " 316 4128 12 2174 223 "
  4.  
  5. patron = r" \d{3} "
  6.  
  7. res = re.findall(patron, cadena)
  8.  
  9. print(res)


Resultado:
Código: [Seleccionar]
[' 316 ', ' 223 ']

Hola, gracias x ocuparte, este primer caso no me convence demasiado porque toda vez que haga
una búsqueda parecida ¿tengo que agregar espacios a ambos lado de la cadena?, digo porque
si la cadena la edito yo todo bien pero que pasa si tengo que hacer la búsqueda en un archivo no creado x mi.-
Otro inconveniente es que si lo pongo de esta manera me toma únicamente el 316
cadena = " 316 4128 a129 2174 $223 "
abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor y cuando lo abrazas dejan de causar dolor.-

Desconectado Daniel1952

  • PIC16
  • ***
  • Mensajes: 127
Re:Expresiones regulares, mostrar exactamente números que contengan 3 dígitos
« Respuesta #4 en: 15 de Noviembre de 2021, 17:17:47 »
Encontré esto y funciona, tiene poco que ver con RE pero bueno, x mucho que leo parece
(no sé qué opinas vos) ser una solución viable, te leo.-

-------------------------------------------------------------------
import re

cadena = "12 123 1124 125 3162 22 451 4500 15"
final = []

patron = r"\d+"
   
res = re.findall(patron, cadena)

for num in res:
    if len(num) == 3:
       final.append(num)
       
if len(final) > 0:
    print(final)
else:
    print("No se encontró ningún numero de 3 cifras")
----------------------------------------------------------------------
abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor y cuando lo abrazas dejan de causar dolor.-

Desconectado Picuino

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 5892
    • Picuino
Re:Expresiones regulares, mostrar exactamente números que contengan 3 dígitos
« Respuesta #5 en: 16 de Noviembre de 2021, 10:14:11 »
Yo veo más elegante la solución que utiliza solo cadenas regulares, pero es cuestión de gustos.

Mira a ver si te gusta este:
Código: Python
  1. import re
  2.  
  3. cadena = "316 4128 a129 2174 $223"
  4.  
  5. patron = r"(?<=[^\d])\d{3}(?=[^\d])"
  6.  
  7. res = re.findall(patron, " " + cadena + " ")
  8.  
  9. print(res)

Desconectado Picuino

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 5892
    • Picuino
Re:Expresiones regulares, mostrar exactamente números que contengan 3 dígitos
« Respuesta #6 en: 16 de Noviembre de 2021, 12:38:11 »
Este es bastante más complejo, pero funciona sin añadir espacios al comienzo y al final de la cadena de texto:

Código: Python
  1. import re
  2.  
  3. cadena = "316 4128 a129 2174 $223"
  4.  
  5. patron = r"\A\d{3}(?=[^\d])|(?<=[^\d])\d{3}(?=[^\d])|(?<=[^\d])\d{3}$"
  6.  
  7. res = re.findall(patron, cadena)
  8.  
  9. print(res)

Ayuda de Python sobre expresiones regulares: https://docs.python.org/es/3/library/re.html

Desconectado Picuino

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 5892
    • Picuino
Re:Expresiones regulares, mostrar exactamente números que contengan 3 dígitos
« Respuesta #7 en: 16 de Noviembre de 2021, 15:11:30 »
Encontré esto y funciona, tiene poco que ver con RE pero bueno, x mucho que leo parece
(no sé qué opinas vos) ser una solución viable, te leo.-

-------------------------------------------------------------------
import re

cadena = "12 123 1124 125 3162 22 451 4500 15"
final = []

patron = r"\d+"
   
res = re.findall(patron, cadena)

for num in res:
    if len(num) == 3:
       final.append(num)
       
if len(final) > 0:
    print(final)
else:
    print("No se encontró ningún numero de 3 cifras")
----------------------------------------------------------------------


Este programa debería programarse así:
Código: Python
  1. import re
  2.  
  3. cadena = "12 123 1124 125 3162 22 451 4500 15"
  4.  
  5. patron = r"\d+"
  6.    
  7. res = re.findall(patron, cadena)
  8.  
  9. final = [num for num in res if len(num) == 3]
  10.  
  11. if len(final) > 0:
  12.     print(final)
  13. else:
  14.     print("No se encontró ningún numero de 3 cifras")

Desconectado Daniel1952

  • PIC16
  • ***
  • Mensajes: 127
Re:Expresiones regulares, mostrar exactamente números que contengan 3 dígitos
« Respuesta #8 en: 17 de Noviembre de 2021, 16:03:51 »
Hola Picuino ¿Cómo están?.
Citar
Yo veo mas elegante la solución que utiliza solo cadenas regulares, pero es cuestión de gustos.
Jajajajaja no amigo, no es cuestión de gusto lo que ocurre es que si acepto algo como mejor
(que es el caso que vos propones) necesito interpretarlo para aprender y las RE si pasa de esto [\b] ya me cuesta,
será como todo cuestión de tiempo.
Citar
Este programa debería programarse así:
Gracia me acortaste las líneas de código y quedo como debe ser.
Slds. Daniel
abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor y cuando lo abrazas dejan de causar dolor.-

Desconectado Picuino

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 5892
    • Picuino
Re:Expresiones regulares, mostrar exactamente números que contengan 3 dígitos
« Respuesta #9 en: 17 de Noviembre de 2021, 17:10:13 »
Jajajajaja no amigo, no es cuestión de gusto lo que ocurre es que si acepto algo como mejor
(que es el caso que vos propones) necesito interpretarlo para aprender y las RE si pasa de esto [\b] ya me cuesta,

Te explico la más difícil:
patron = r"\A\d{3}(?=[^\d])|(?<=[^\d])\d{3}(?=[^\d])|(?<=[^\d])\d{3}$"

El patron captura lo siguiente:
\A = comienzo de cadena de texto
\d{3} = Tres dígitos
(?=[^\d]) = Finaliza con algo que no sea un número [^\d].
                 Pero no lo tiene en cuenta a la hora de capturar el final de la cadena (?= )

|   =  o captura lo siguiente

(?<=[^\d]) = comienza con algo que no sea un dígito
                 Pero no lo tiene en cuenta a la hora de capturar el inicio de la cadena (?<= )
\d{3} = Tres dígitos
(?=[^\d]) = Finaliza con algo que no sea un número [^\d].
                 Pero no lo tiene en cuenta a la hora de capturar el final de la cadena (?= )

|   =  o captura lo siguiente

(?<=[^\d]) = comienza con algo que no sea un dígito
                 Pero no lo tiene en cuenta a la hora de capturar el inicio de la cadena (?<= )
\d{3} = Tres dígitos
$ = Final de la cadena de texto



Si es demasiado complicado, el otro programa te da también la solución que buscas.
Saludos.

Desconectado Daniel1952

  • PIC16
  • ***
  • Mensajes: 127
Re:Expresiones regulares, mostrar exactamente números que contengan 3 dígitos
« Respuesta #10 en: 17 de Noviembre de 2021, 17:31:02 »
Mmmmmmmmm esto me gusta mucho, recién lo leo, lo voy a estudiar a fondo y cualquier
cosa te consulto, te muestro (con una captura) como me resulta mas fácil aprender,
¿será x mis 70 años, jajajajaja?

slds.
abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor y cuando lo abrazas dejan de causar dolor.-

Desconectado Picuino

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 5892
    • Picuino
Re:Expresiones regulares, mostrar exactamente números que contengan 3 dígitos
« Respuesta #11 en: 18 de Noviembre de 2021, 11:14:34 »
También puedes hacer pruebas quitando elementos a ver que pasa.

Desconectado Daniel1952

  • PIC16
  • ***
  • Mensajes: 127
Re:Expresiones regulares, mostrar exactamente números que contengan 3 dígitos
« Respuesta #12 en: 18 de Noviembre de 2021, 11:52:00 »
Esta pagina es muy buena para practicar ER, muy buena.
https://regex101.com/
abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor y cuando lo abrazas dejan de causar dolor.-

Desconectado Picuino

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 5892
    • Picuino
Re:Expresiones regulares, mostrar exactamente números que contengan 3 dígitos
« Respuesta #13 en: 18 de Noviembre de 2021, 12:05:58 »
Si que es bastante buena. Me la apunto.



 

anything