Python 匹配文件中的所有 URL,并在文件的新行中列出每个 URL



我正在尝试获得一个脚本,该脚本打开一个文件,为所有URL匹配该文件,并输出一个只有匹配项的新文件。目前,下面的情况只是获得第一场比赛。我正在解析的文件基本上是一行多个url"这是一个随机的url字符串http://www.yandex.ru:8080,http://www.hao123.com:8080,这里还有一点,http://www.wordpress.com:8080,";

import re
with open("C:\Users\username\Desktop\test.txt") as f:
Lines = f.readlines()
file_to_write = open("C:\Users\username\Desktop\output.txt", "w")
pattern = 'https?://(?:w{1,3}.)?[^s.]+(?:.[a-z]+)*(?::d+)?(?![^<]*(?:</w+>|/?>))'
matches = []
for line in Lines:
m = re.search(pattern, line)
if m:
matches.append(m.group(0))
print(matches)
file_to_write.write("n".join(matches))

现在,如果我用更简单的东西替换regex,比如"(https?://.(:(\d(";我得到了所有的火柴,但它们并没有在线上分开,而是在一条线上连接在一起。

不知道如何修改脚本或Regex以捕获所有URL的base:port并添加到新行中。

Regex的当前输出("(https://.(:(\d("(:

http://www.yandex.ru:8080, http://www.hao123.com:8080, antoher bit here , http://www.wordpress.com:8080,http://www.gmw.cn:8080, http://www.tumblr.com:8080/test/etete/eete, http://www.paypal.com:8080

期望输出:

http://www.yandex.ru:8080
http://www.hao123.com:8080
http://www.wordpress.com:8080
http://www.gmw.cn:8080
http://www.tumblr.com:8080
http://www.paypal.com:8080

您可以尝试使用re.findall(以及您拥有的模式(:

>>> import re
>>>
>>> s = 'This is a a random string of urls http://www.yandex.ru:8080, http://www.hao123.com:8080, another bit here, http://www.wordpress.com:8080,'
>>> pattern = 'https?://(?:w{1,3}.)?[^s.]+(?:.[a-z]+)*(?::d+)?(?![^<]*(?:</w+>|/?>))'
>>> urls = re.findall(pattern, s)
>>> urls
['http://www.yandex.ru:8080', 'http://www.hao123.com:8080', 'http://www.wordpress.com:8080']

然后,您可以根据需要使用名为urlslist。例如,要在文件中写入URL,可以使用(已经有了(file_to_write.write('n'.join(urls))。举例说明:

>>> print('n'.join(urls))
http://www.yandex.ru:8080
http://www.hao123.com:8080
http://www.wordpress.com:8080

最终得到以下结果:

for line in Lines:
m = re.findall(pattern, line)
if m:
print('n'.join(m))
matches += m
file_to_write.write('n'.join(matches))

这似乎正是我所需要的。

您的第一个(未简化的(正则表达式可以很好地处理给定的url。问题是你只选了第一场比赛由于CCD_ 5。

另一方面,您的简化regex(我认为它将类似于'https?://.+:d+'而非'(https?://.):(d)'(是贪婪的从行中的第一个http:到最后一个CCD_ 9。正则表达式不正确,请不要考虑添加结果的换行符。

那么你可以试试以下方法吗:

import re
with open("C:\Users\username\Desktop\test.txt") as f:
Lines = f.readlines()
file_to_write = open("C:\Users\username\Desktop\output.txt", "w")
pattern = 'https?://(?:w{1,3}.)?[^s.]+(?:.[a-z]+)*(?::d+)?(?![^<]*(?:</w+>|/?>))'
for line in Lines:
m = re.findall(pattern, line)
print('n'.join(m))
file_to_write.write('n'.join(m) + 'n')
file_to_write.close()

最新更新