python从没有html标记的文本文件中提取URL

python从没有html标记的文本文件中提取URL,python,regex,parsing,url,Python,Regex,Parsing,Url,我发现这里的大多数帖子都是通过标签在文本文件中查找URL。但并非所有文本文件旁边都有html标记。我正在寻找一种在这两种情况下都有效的解决方案。以下正则表达式为: 'http[s]?://(?:[a-zA-Z]|[0-9]|[$-_@.&+]|[!*\(\),]|(?:%[0-9a-fA-F][0-9a-fA-F]))+' regex使用下面的代码从文本文件中获取URL,但问题是它还需要不必要的字符,如“>” 这是我的密码: import re def extractURLs(file

我发现这里的大多数帖子都是通过标签在文本文件中查找URL。但并非所有文本文件旁边都有html标记。我正在寻找一种在这两种情况下都有效的解决方案。以下正则表达式为:

'http[s]?://(?:[a-zA-Z]|[0-9]|[$-_@.&+]|[!*\(\),]|(?:%[0-9a-fA-F][0-9a-fA-F]))+'
regex使用下面的代码从文本文件中获取URL,但问题是它还需要不必要的字符,如“>”

这是我的密码:

import re
def extractURLs(fileContent):
    urls = re.findall('http[s]?://(?:[a-zA-Z]|[0-9]|[$-_@.&+]|[!*\(\),]|(?:%[0-9a-fA-F][0-9a-fA-F]))+', fileContent.lower())
    print urls
    return urls

myFile = open("emailBody.txt")
fileContent = myFile.read()
URLs = URLs + extractURLs(fileContent)
输出示例如下所示:

http://saiconference.com/ficc2018/submit
http://52.21.30.170/sendy/unsubscribe/qhiz2s763l892rkps763chacs52ieqkagf8rbueme9n763jv6da/hs1ph7xt5nvdimnwwfioya/qg0qteh7cllbw8j6amo892ca>
https://www.youtube.com/watch?v=gvwyoqnztpy>
http://saiconference.com/ficc
http://saiconference.com/ficc>
http://saiconference.com/ficc2018/submit>

正如您所看到的,有些字符(如“>”)会导致问题。我做错了什么?

快速解决方案,假设'>'是最后出现的唯一字符:
url.rstrip('>')

删除单个字符串中最后出现的字符(多个)。因此,您必须遍历列表并删除该字符

编辑:刚刚有一台使用python的PC,所以在测试后给出一个正则表达式的答案

import re
def extractURLs(fileContent):
    urls = re.findall('http[s]?://(?:[a-zA-Z]|[0-9]|[$-_@.&+]|[!*\(\),]|(?:%[0-9a-fA-F][0-9a-fA-F]))+', fileContent.lower())
    cleanUrls = []
    for url in urls:
        lastChar = url[-1] # get the last character
        # if the last character is not (^ - not) an alphabet, or a number,
        # or a '/' (some websites may have that. you can add your own ones), then enter IF condition
        if (bool(re.match(r'[^a-zA-Z0-9/]', lastChar))): 
            cleanUrls.append(url[:-1]) # stripping last character, no matter what
        else:
            cleanUrls.append(url) # else, simply append to new list
    print(cleanUrls)
    return cleanUrls

URLs = extractURLs("http://saiconference.com/ficc2018/submit>")

但是,如果它只有一个字符,那么使用.rstrip()就更简单。

能否请您共享emailBody.txt的一些内容。这样你就更容易理解你的课文了。因此,您可以在您的问题中添加此文本吗?在
url=url+extractURL(fileContent)
中,您尚未定义
url
很抱歉给您带来麻烦。我知道我的问题出在正则表达式上。请设想代码的其余部分工作正常。“删除单个字符串中最后出现的字符”不太正确。如果字符串末尾有多个“>”,rstrip()将全部删除。但听上去,这正是OP想要的。是的,你是对的。我将编辑我的答案,让它更清楚。我坚持OP的需要,以一种简单的方式获得一个干净的url。在您提到的例子中,最简单的方法是检查最后一个字符(
lastChar=url[len(url)-1]
)是否为
,如果
True
,则
cleanUrls.append(url[:-1])
获取url最后一个字符的最简单方法是
url[-1]
,无需调用
len()