Sacar subcadenas siguiendo un patron de un texto


#1

hola,
lo que pretendo hacer es sacar individualmente los mails de un texto, ya
que vamos a incluir nuestras listas de correo a base de datos y tenemos
las direcciones de email en texto. Basicamente mi problema es qué
funcion usar, ya que la expresión regular de un mail la he encontrado
por ahi
/\A([^@\s]+)@((?:[-a-z0-9]+.)+[a-z]{2,})/
Siendo mi texto ‘texto’ y exp =
/\A([^@\s]+)@((?:[-a-z0-9]+.)+[a-z]{2,})/ intento hacer:
mail = exp.match(texto)
me devuelve bien, el email separado pero como puedo crear un bucle para
seguir sacando los siguientes mails del texto por dnd me había quedado?
si hago un bucle podria ir guardandolos o grabandolos en algun array o
algo. Gracias!!


#2

Siendo mi texto ‘texto’ y exp =
/\A([^@\s]+)@((?:[-a-z0-9]+.)+[a-z]{2,})/ intento hacer:
mail = exp.match(texto)
me devuelve bien, el email separado pero como puedo crear un bucle para
seguir sacando los siguientes mails del texto por dnd me había quedado?

usa el método scan de la cadena directamente

texto.scan(exp)

y te da el array de ocurrencias

saludos,


javier ramírez

…i do ruby on rails development in madrid, spain, at
http://www.aspgems.com
…you can find out more about me on http://formatinternet.wordpress.com
and http://workingwithrails.com/person/5987-javier-ramirez


#3

javier ramirez wrote:

usa el método scan de la cadena directamente

texto.scan(exp)

y te da el array de ocurrencias

saludos,


javier ramírez

…i do ruby on rails development in madrid, spain, at
http://www.aspgems.com
…you can find out more about me on http://formatinternet.wordpress.com
and http://workingwithrails.com/person/5987-javier-ramirez

lo habia probado ya, si el mail es removed_email_address@domain.invalid
el resultado que me da es [[“xxx”,“yyy.zzz”]] se come la @ y me lo parte
en 2, a parte de q solo me saca 1, no se qué hacer, si un bucle o algo
pero no se q condicion poner. igual tengo mal mi expresion regular pero
en otros casos me ha dado bien… muchas gracias!!


#4

lo habia probado ya, si el mail es removed_email_address@domain.invalid
el resultado que me da es [[“xxx”,“yyy.zzz”]] se come la @ y me lo parte

eso debe ser porque usas grupos (paréntesis) en al regexp.

las expresiones regulares para extraer un mail son más bien complicadas,
así que no me he parado a ver si la que tienes es muy buena o no, pero
quitándole los grupos podría quedar en algo así

/[^@\s]+@[-a-z0-9]+.+[a-z]{2,}/

y ésa funciona en un scan

suerte,


javier ramírez

…i do ruby on rails development in madrid, spain, at
http://www.aspgems.com
…you can find out more about me on http://formatinternet.wordpress.com
and http://workingwithrails.com/person/5987-javier-ramirez


#5

Hola Javier, no te enfades, por ser puñetero, pero ponte que los mail
los
tiene que extraer de un párrafo y la persona que escribió el párrafo
puso
algo así:
“me dirijo a ustedes para comunicarles que este es mi
email:removed_email_address@domain.invalid
removed_email_address@domain.invalid…y que esta es mi …”
Como ves en =>> email:emailqueinteresa no se ha dejado el
correspondiente
espacio después de los dos puntos.

Esto por consola me da:
=>[“email:removed_email_address@domain.invalid
removed_email_address@domain.invalid”,
“removed_email_address@domain.invalid”,…]

¿un mail puede llevar ? (:,;[^*…)¿esto es algo que se contemple? ¿o
te
estoy tocando las bolas gratuitamente?

¿Conoces alguna expreg realmente buena para solventar esta y mil
chorradas
más?

En cualquier caso yo tambien soy un novato y te agradezco que me hayas
descubierto al amigo [scan] igual lo habia leido ya, pero cuando tienes
el
problema no te acuerdas de como se hace hasta que lo haces…

Un saludo

El 30 de enero de 2009 14:40, javier ramirez
removed_email_address@domain.invalidescribió:


#6

solo por curiosidad, ¿no necesitas tener un caracter separador que
identifique donde empieza y donde termina el email?
tenes una lista de emails o lo que en realidad queres hacer es extraer
los email de un .html?

2009/1/30 Andrés gutiérrez removed_email_address@domain.invalid:

¿un mail puede llevar ? (:,;[^*…)¿esto es algo que se contemple? ¿o te

quitándole los grupos podría quedar en algo así

http://www.aspgems.com
removed_email_address@domain.invalid
http://lists.simplelogica.net/mailman/listinfo/ror-es



J. Martin Fernandez Szutner
removed_email_address@domain.invalid [main address]
móvil: ++521(662)224.02.81
msn: removed_email_address@domain.invalid
skype: martinszutner


Este correo electronico es confidencial y/o puede contener informacion
privilegiada.
Si usted no es su destinatario o no es alguna persona autorizada por
este para recibir sus correos electronicos, NO debera usted utilizar,
copiar, revelar, o tomar ninguna accion basada en este correo
electronico o cualquier otra informacion incluida en el, favor de
notificar al remitente de inmediato mediante el reenvio de este correo
electronico y borrar a continuacion totalmente este correo electronico
y sus anexos.
Nota: Los acentos y caracteres especiales fueron omitidos para su
correcta lectura en cualquier medio electronico.

This e-mail is confidential and/or may contain privileged information.
If you are not the addressee or authorized to receive this for the
addressee, you must not use, copy, disclose, or take any action based
on this message or any
other informat ion herein, please advise the sender immediately by
reply this e-mail and delete this e-mail and its attachments.


#7

Ror-es mailing list
removed_email_address@domain.invalid
http://lists.simplelogica.net/mailman/listinfo/ror-es


#8

solo por curiosidad, ¿no necesitas tener un caracter separador que
identifique donde empieza y donde termina el email?
tenes una lista de emails o lo que en realidad queres hacer es extraer
los email de un .html?

Es igual, con la solución de Javier R. se pueden sacar los emails
de un
párrafo. Haz la prueba, abre un terminal y crea una cadena de texto con
emails:
cadena=“removed_email_address@domain.invalid esto no es un email. Esto tampoco es un email.
removed_email_address@domain.invalid esto no es un email…”
veras que si haces:
matrizEmails = Array.new
matrizEmails = cadena.scan(/[^@\s]+@[-a-z0-9]+.+[a-z]{2,}/)

matrizEmails.each {|email| puts email}
removed_email_address@domain.invalid
removed_email_address@domain.invalid

De manera mágica tendras una matriz con todos los emails.

Un saludo

El 30 de enero de 2009 16:06, Martin S.
removed_email_address@domain.invalidescribió:


#9

Mis dudas han sido puñeteramente aclaradas :slight_smile:

Gracias Guillermo

Un saludo

El 30 de enero de 2009 16:50, Guillermo Álvarez Fernández <
removed_email_address@domain.invalid> escribió:


#10

Rails usa ActionMailer, ActionMailer usa TMAIL luego ¿Cómo se usa el
metodo
parser de TMAIL en Rails?¿O me estoy liando?

Un saludo
El 30 de enero de 2009 17:08, javier ramirez
removed_email_address@domain.invalidescribió:


#11

hola,

=>[“email:removed_email_address@domain.invalid
mailto:removed_email_address@domain.invalid”, “removed_email_address@domain.invalid
mailto:removed_email_address@domain.invalid”,…]
¿un mail puede llevar ? (:,;[^*…)¿esto es algo que se contemple? ¿o
te estoy tocando las bolas gratuitamente?

por esto decía en mi mail:

“las expresiones regulares para extraer un mail son más bien complicadas,
así que no me he parado a ver si la que tienes es muy buena o no,”

validar toda la casuística de lo que puede valer como dirección de mail es
complejo, mucho… hay expresiones regulares que dan miedo.

el problema inicial decía “tengo una regexp que ya me va bien para parsear
los mails pero sólo se ejecuta una vez”. Así que el problema no está en la
regexp, sino en recoger todas las ocurrencias. Para eso, una solución es
modificar esa regexp para que no use grupos, y usar el scan.

si lo que quieres luego es validar cada cadena encontrada, en mi caso la
forma práctica que he encontrado y que me ha parecido más razonable es
utilizar el método parse de direcciones de TMAIL para ver si eso tiene
pinta de mail válido sí o no.

Si TMAIL lo sabe parsear, me creo que es una dirección. Si miras el fuente
del parser (basado en racc) que usa TMAIL para validar cabeceras,
verás que no es un tema trivial. Pero como ya está inventado, delego en su
validación y me va bien lo que me diga.


javier ramírez

…i do ruby on rails development in madrid, spain, at
http://www.aspgems.com
…you can find out more about me on http://formatinternet.wordpress.com
and http://workingwithrails.com/person/5987-javier-ramirez


#12

Andrés gutiérrez wrote:

Rails usa ActionMailer, ActionMailer usa TMAIL luego ¿Cómo se usa el
metodo parser de TMAIL en Rails?¿O me estoy liando?

se usa el método parse de Tmail::Address exactamente como dice la
documentación de tmail

dejo como ejercicio para casa que lo busques en google :slight_smile:


javier ramírez

…i do ruby on rails development in madrid, spain, at
http://www.aspgems.com
…you can find out more about me on http://formatinternet.wordpress.com
and http://workingwithrails.com/person/5987-javier-ramirez


#13

TMail::Address.parse(‘removed_email_address@domain.invalid’)
=> #<TMail::Address fo|removed_email_address@domain.invalid>

TMail::Address.parse(‘fo@removed_email_address@domain.invalid’)
TMail::SyntaxError: parse error on token “@”
from parser.y:379:in on_error' from (irb):8:in_racc_yyparse_c’

He probado eso en la consola de Rails, y como se ve para saber si un
correo
es valido solo hay que atrapar la excepción.

Saludos.


#14

Hola,
gracias a todos por contestarme, hoy mismo probaré a ver si con esa
nueva expresión regular me funciona, y resolviendo la curiosidad, mis
jefes enviaban una lista de correos desde el outlook y ahora quieren
almacernar los mails en base de datos pero nada más me pasaron un txt
con las listas de correos a trozos, correos separados por comas,
espacios, algun texto, algun < y >, puntos y comas y yo es q les dije q
podria escanearlo y guardarlos, solo que al ponerme en ello encontre
problemas que creian q iba a ser más fácil para mi jejejej muchas
gracias a todos!


#15

dejo como ejercicio para casa que lo busques en google :slight_smile:
ok ;D
Gracias

El 30 de enero de 2009 17:42, javier ramirez
removed_email_address@domain.invalidescribió:


#16

Os amo!! funciona genial!! Muchas gracias nens, era la expresion
regular!!