我正在尝试获得一个脚本,该脚本打开一个文件,为所有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']
然后,您可以根据需要使用名为urls
的list
。例如,要在文件中写入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()