79

I want to remove all URLs inside a string (replace them with "") I searched around but couldn't really find what I want.

Example:

text1
text2
http://url.com/bla1/blah1/
text3
text4
http://url.com/bla2/blah2/
text5
text6
http://url.com/bla3/blah3/

I want the result to be:

text1
text2
text3
text4
text5
text6
Taha
  • 1,592
  • 2
  • 18
  • 24

15 Answers15

113

the shortest way

re.sub(r'http\S+', '', stringliteral)
tolgayilmaz
  • 3,987
  • 2
  • 19
  • 19
  • 1
    This will also remove 'httpabc' and 'abchttp'. – Louis Yang Oct 06 '18 at 00:52
  • 5
    @LouisYang huh? it shouldn't (and doesn't; at least on 3.7) remove abchttp. You'd have to use `.*http` or something like that. BTW, I'd suggest `r'https?://\S+'`. – Igor Hatarist Feb 16 '19 at 00:53
  • this is the best solution and should be marked as the right answer – Henley n Jun 23 '20 at 21:29
  • 1
    You can also write it like `text = re.sub(r"\S*https?:\S*", "", text)` to remove the https even if they're in paranthesis or brackets. – mitra mirshafiee Mar 12 '21 at 11:44
  • 1
    @henley, above code did not work for my text: '''$0.29 non-gaap diluted income per share. [$29 million after tax] on the revaluation, http : //www.businesswire.com/news/home/20210217005928/en .-AAAAA-santa clara,""" – tursunWali Mar 20 '21 at 02:53
  • @tursunWali i think it's because of the space in your link but i'm not sure? – Henley n Mar 21 '21 at 05:43
  • The above solution will also remove 'httpabc' etc, to overcome that, you can use something like `re.sub(r'http\S*:{1}/{2}\S+', '', sentence)` – MasterBlasterCoder Nov 14 '22 at 08:16
  • same here. didn't work on several tweets when used in a function. ```re.sub(r'^https?:\/\/.*[\r\n]*', '', text, flags=re.MULTILINE)``` worked – Simone Mar 29 '23 at 09:35
94

Python script:

import re
text = re.sub(r'^https?:\/\/.*[\r\n]*', '', text, flags=re.MULTILINE)

Output:

text1
text2
text3
text4
text5
text6

Test this code here.

Ωmega
  • 42,614
  • 34
  • 134
  • 203
  • 10
    This solution assumes that any URL is immediately follows by a new line (which is the case in the OP's example, but just FYI). tolgayilmaz's [regular expression](https://stackoverflow.com/a/40823105/395857) doesn't have this potential shortcoming. – Franck Dernoncourt Apr 10 '18 at 21:07
  • @FranckDernoncourt Interesting because this was not the case for the twitter dataset I am working with. Above code removed all urls despite them not being immediately followed by a new line – Simone Mar 29 '23 at 09:37
30

This worked for me:

import re
thestring = "text1\ntext2\nhttp://url.com/bla1/blah1/\ntext3\ntext4\nhttp://url.com/bla2/blah2/\ntext5\ntext6"

URLless_string = re.sub(r'\w+:\/{2}[\d\w-]+(\.[\d\w-]+)*(?:(?:\/[^\s/]*))*', '', thestring)
print URLless_string

Result:

text1
text2

text3
text4

text5
text6
Taha
  • 1,592
  • 2
  • 18
  • 24
19

Removal of HTTP links/URLs mixed up in any text:

import re
re.sub(r'''(?i)\b((?:https?://|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}/)(?:[^\s()<>]+|\(([^\s()<>]+|(\([^\s()<>]+\)))*\))+(?:\(([^\s()<>]+|(\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:'".,<>?«»“”‘’]))''', " ", text)
Pranzell
  • 2,275
  • 16
  • 21
  • 2
    This method hangs for me when parsing a string with '[]()'. Any idea why? – Vid Stropnik Jun 24 '20 at 15:31
  • 1
    above method worked for me. I think this is most comprehensive solution. – tursunWali Mar 20 '21 at 03:01
  • just a stern warning, i attempted to use this exact regex to remove URLS from a ve...eeery long text in ONE , just ONE record in swifter + pandas dataframe. and after waiting for hours it didn't seem to end... then I used this one https://stackoverflow.com/a/38498442/1465073, and the same text took like a fraction of a second to finish. I lost like 12-24 hours worth of work just trying to figure out what was happening. No errors, no warnings, just my apply function seemingly frozen for hours. Im using 13700K, 2 x 16 DDR5 6000, RTX 4090. The same issue manifested in Azure cloud A100 and V100s – user1465073 Mar 07 '23 at 17:32
17

This solution caters for http, https and the other normal url type special characters :

import re
def remove_urls (vTEXT):
    vTEXT = re.sub(r'(https|http)?:\/\/(\w|\.|\/|\?|\=|\&|\%)*\b', '', vTEXT, flags=re.MULTILINE)
    return(vTEXT)


print( remove_urls("this is a test https://sdfs.sdfsdf.com/sdfsdf/sdfsdf/sd/sdfsdfs?bob=%20tree&jef=man lets see this too https://sdfsdf.fdf.com/sdf/f end"))
Lee Martin
  • 171
  • 1
  • 3
  • 1
    It doesn't work if the URL content a hyphen, e.g. `print(remove_urls("this https://sdfs-sdfsdf.com yo"))` -> `this is a test -sdfsdf.com yo` – Franck Dernoncourt Apr 10 '18 at 20:54
  • 1
    Use this instead (r'(https|http)?:\/\/(\w|\.|\/|\?|\=|\&|\%|\-)*\b' – Yash Gupta Jan 21 '21 at 18:03
  • I like the idea of this, but why is `(http|https)` optional? Do any URLs begin with `://`? I have had decent success with `(https|http|ftp):\/\/\S+` – oelna Jun 18 '21 at 15:45
15

I wasn't able to find any that handled my particular situation, which was removing urls in the middle of tweets that also have whitespaces in the middle of urls so I made my own:

(https?:\/\/)(\s)*(www\.)?(\s)*((\w|\s)+\.)*([\w\-\s]+\/)*([\w\-]+)((\?)?[\w\s]*=\s*[\w\%&]*)*

here's an explanation:
(https?:\/\/) matches http:// or https://
(\s)* optional whitespaces
(www\.)? optionally matches www.
(\s)* optionally matches whitespaces
((\w|\s)+\.)* matches 0 or more of one or more word characters followed by a period
([\w\-\s]+\/)* matches 0 or more of one or more words(or a dash or a space) followed by '\'
([\w\-]+) any remaining path at the end of the url followed by an optional ending
((\?)?[\w\s]*=\s*[\w\%&]*)* matches ending query params (even with white spaces,etc)

test this out here:https://regex101.com/r/NmVGOo/8

13

What you really want to do is to remove any string that starts with either http:// or https:// plus any combination of non white space characters. Here is how I would solve it. My solution is very similar to that of @tolgayilmaz

#Define the text from which you want to replace the url with "".
text ='''The link to this post is https://stackoverflow.com/questions/11331982/how-to-remove-any-url-within-a-string-in-python'''

import re
#Either use:
re.sub('http://\S+|https://\S+', '', text)
#OR 
re.sub('http[s]?://\S+', '', text)

And the result of running either code above is

>>> 'The link to this post is '

I prefer the second one because it is more readable.

Samuel Nde
  • 2,565
  • 2
  • 23
  • 23
8

In order to remove any URL within a string in Python, you can use this RegEx function :

import re

def remove_URL(text):
    """Remove URLs from a text string"""
    return re.sub(r"http\S+", "", text)
mounirboulwafa
  • 1,587
  • 17
  • 18
7

I know this has already been answered and its stupid late but I think this should be here. This is a regex that matches any kind of url.

[^ ]+\.[^ ]+

It can be used like

re.sub('[^ ]+\.[^ ]+','',sentence)
Nischit Pradhan
  • 440
  • 6
  • 18
6

You could also look at it from the other way around...

from urlparse import urlparse
[el for el in ['text1', 'FTP://somewhere.com', 'text2', 'http://blah.com:8080/foo/bar#header'] if not urlparse(el).scheme]
Jon Clements
  • 138,671
  • 33
  • 247
  • 280
3

The following regular expression in Python works well for detecting URL(s) in the text:

source_text = '''
text1
text2
http://url.com/bla1/blah1/
text3
text4
http://url.com/bla2/blah2/
text5
text6    '''

import re
url_reg  = r'[a-z]*[:.]+\S+'
result   = re.sub(url_reg, '', source_text)
print(result)

Output:

text1
text2

text3
text4

text5
text6
1

why do not use this its so complete

i = re.sub(r"(https?:\/\/)?([\da-z\.-]+)\.([a-z\.]{2,6})([\/\w \.-]*)","",i)
FObersteiner
  • 22,500
  • 8
  • 42
  • 72
Ilya
  • 1
  • 5
  • 18
0
import re
s = '''
text1
text2
http://url.com/bla1/blah1/
text3
text4
http://url.com/bla2/blah2/
text5
text6
http://url.com/bla3/blah3/'''
g = re.findall(r'(text\d+)',s)
print ('list',g)
for i in g:
    print (i)

Out

list ['text1', 'text2', 'text3', 'text4', 'text5', 'text6']
text1
text2
text3
text4
text5
text6    ​
0

I think the most general URL regex pattern is this one:

URL_PATTERN = r'[A-Za-z0-9]+://[A-Za-z0-9%-_]+(/[A-Za-z0-9%-_])*(#|\\?)[A-Za-z0-9%-_&=]*'

There is a small module that does what do you want:

pip install mysmallutils
from mysutils.text import remove_urls

remove_urls(text)
0

A simple .* with a positive look behind should do the job.

text="text1\ntext2\nhttp://url.com/bla1/blah1/\ntext3\ntext4\nhttp://url.com/bla2/blah2/\ntext5\ntext6"

req=re.sub(r'http.*?(?=\s)', " ", text)
print(req)
TBhavnani
  • 721
  • 7
  • 12