Cómo detectar y eliminar un enlace dentro de una cadena de python3

votos
1

Tengo cadenas que pueden (o no) contener vínculos. Si el vínculo existe, que está rodeado de [/ link] [link] fichas. Me gustaría sustituir aquellas partes con alguna señal especial como URL. y devolver el enlace correspondiente.

Ejemplo

Vamos a suponer que la función detect_linkhace lo siguiente:

>input= 'The statement [link] http://www.washingtontimes.com/news/2017/sep/9/rob-ranco-texas-lawyer-says-he-would-be-ok-if-bets/ [/link] The Washington Times'
>replacement_token = URL
>link,new_sentence = detect_link(input,replacement_token)
>link
'http://www.washingtontimes.com/news/2017/sep/9/rob-ranco-texas-lawyer-says-he-would-be-ok-if-bets/'
>new_sentence
'The statement URL The Washington Times'

He buscado un poco y encontré que las expresiones regulares pueden ser utilizados para hacer eso. Sin embargo, no lo hago ninguna experiencia con ellos. Alguien me puede ayudar en eso?

EDIT Los enlaces no tienen ningún patrón constante. Se puede o no comenzar con http. Se puede o no terminar con .com, etc.

Publicado el 20/10/2018 a las 10:32
fuente por usuario
En otros idiomas...                            


1 respuestas

votos
2

Es necesario un patrón de expresión regular para eso. Yo uso http://www.regex101.com jugar con expresiones regulares.

Puede usar ese modelo para extraer y reemplazar las cosas las cosas de este modo:

import re

text = 'The statement [link] http://www.washingtontimes.com/news/2017/sep/9/rob-ranco-texas-lawyer-says-he-would-be-ok-if-bets/ [/link] The Washington Times'

# get what what matched
for mat in re.findall(r"\[link\](.*?)\[/link\]",text):
    print(mat)

# replace a match with sthm other
print( re.sub(r"\[link\](.*?)\[/link\]","[URL]",text))

Salida:

http://www.washingtontimes.com/news/2017/sep/9/rob-ranco-texas-lawyer-says-he-would-be-ok-if-bets/ 

The statement [URL] The Washington Times

El patrón de uso no es codicioso, así que no lo puedo coincide con múltiples partes [link] [/ link] si occure en una frase, pero sólo las más cortas:

\[link\](.*?)\[/link\]   - matches a literal [ followed by link followed by literal ]
                           with as few things before matching the endtag [/link]

Sin partidos no codiciosos sólo tienes una substituye para el conjunto de

The statement [link] http://www.washingtontimes.com/news/2017/sep/9/rob-ranco-texas-lawyer-says-he-would-be-ok-if-bets/ [/link] and this also [link] http://www.washingtontimes.com/news/2017/sep/9/rob-ranco-texas-lawyer-says-he-would-be-ok-if-bets/ [/link] The Washington Times

en lugar de dos.


encontrar todos los enlaces:

import re
text = """
The statement [link] link 1 [/link] and [link] link 2 [/link] The Washington Times
The statement [link] link 3 [/link] and [link] link 4 [/link] The Washington Times
"""

# get what what matched
links = re.findall(r"\[link\](.*)\[/link\]",text)        # greedy pattern
links_lazy = re.findall(r"\[link\](.*?)\[/link\]",text)  # lazy pattern

Salida:

# greedy
[' link 1 [/link] and [link] link 2 ', 
 ' link 3 [/link] and [link] link 4 ']
# lazy
[' link 1 ', ' link 2 ', ' link 3 ', ' link 4 ']

La diferencia es visible si no se incluye saltos de línea en el partido de texto-a-- el (*.)no coincide con saltos de línea - por lo que si tiene varios enlaces en una oración se necesita un (.*?)partido para conseguir tanto como un solo partido en vez de conseguir toda la parte igualada .

Respondida el 20/10/2018 a las 10:38
fuente por usuario

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more