TODOPIC

Lenguajes de programación para PC => Python => Mensaje iniciado por: Daniel1952 en 15 de Noviembre de 2021, 11:03:37

Título: Expresiones regulares, mostrar exactamente números que contengan 3 dígitos
Publicado por: Daniel1952 en 15 de Noviembre de 2021, 11:03:37
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)
Título: Re:Expresiones regulares, mostrar exactamente números que contengan 3 dígitos
Publicado por: Picuino 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 ']
Título: Re:Expresiones regulares, mostrar exactamente números que contengan 3 dígitos
Publicado por: Picuino 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']
Título: Re:Expresiones regulares, mostrar exactamente números que contengan 3 dígitos
Publicado por: Daniel1952 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 "
Título: Re:Expresiones regulares, mostrar exactamente números que contengan 3 dígitos
Publicado por: Daniel1952 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")
----------------------------------------------------------------------
Título: Re:Expresiones regulares, mostrar exactamente números que contengan 3 dígitos
Publicado por: Picuino 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)
Título: Re:Expresiones regulares, mostrar exactamente números que contengan 3 dígitos
Publicado por: Picuino 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
Título: Re:Expresiones regulares, mostrar exactamente números que contengan 3 dígitos
Publicado por: Picuino 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")
Título: Re:Expresiones regulares, mostrar exactamente números que contengan 3 dígitos
Publicado por: Daniel1952 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
Título: Re:Expresiones regulares, mostrar exactamente números que contengan 3 dígitos
Publicado por: Picuino 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.
Título: Re:Expresiones regulares, mostrar exactamente números que contengan 3 dígitos
Publicado por: Daniel1952 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.
Título: Re:Expresiones regulares, mostrar exactamente números que contengan 3 dígitos
Publicado por: Picuino en 18 de Noviembre de 2021, 11:14:34
También puedes hacer pruebas quitando elementos a ver que pasa.
Título: Re:Expresiones regulares, mostrar exactamente números que contengan 3 dígitos
Publicado por: Daniel1952 en 18 de Noviembre de 2021, 11:52:00
Esta pagina es muy buena para practicar ER, muy buena.
https://regex101.com/ (https://regex101.com/)
Título: Re:Expresiones regulares, mostrar exactamente números que contengan 3 dígitos
Publicado por: Picuino en 18 de Noviembre de 2021, 12:05:58
Si que es bastante buena. Me la apunto.
Título: Re:Expresiones regulares, mostrar exactamente números que contengan 3 dígitos
Publicado por: Nocturno en 19 de Noviembre de 2021, 03:01:05
Esta pagina es muy buena para practicar ER, muy buena.
https://regex101.com/ (https://regex101.com/)
¡Es genial!
Muchas gracias
Título: Re:Expresiones regulares, mostrar exactamente números que contengan 3 dígitos
Publicado por: Daniel1952 en 19 de Noviembre de 2021, 08:49:54
Como es probable que alguien que consulta este foro tenga alguna dificultad
con el ingles dejo una página en español, no parece ser tan completa pero el
cometido lo cumple sobradamente, que tengan todos un lindo lindo Viernes.

https://es.infobyip.com/regularexpressioncalculator.php (https://es.infobyip.com/regularexpressioncalculator.php)