我试图从文本文件中提取url,并陷入无限循环
import re
URL_PATTERN = re.compile(ur'''(?i)\b((?:https?://|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}/)(?:[^\s()<>]+|\(([^\s()<>]+|(\([^\s()<>]+\)))*\))+(?:\(([^\s()<>]+|(\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:'".,<>?«»“”‘’]))''')
with open("some_text_file") as RAW:
for line in RAW:
RESULT = URL_PATTERN.findall(line)
links = []
for HTTP_TUPLES in RESULT:
links.append(HTTP_TUPLES[0])
我怎么才能避免呢?在
PS:是的,我知道urllib和其他模块
试试看这个。这个会这样做的你。看到了吗演示。在
https://www.regex101.com/r/bC8aZ4/20
我不想在这个答案中说明正则表达式的正确性。您可能需要查看一下有关URL验证的this article,并为您的匹配任务自定义它。
问题
您的regex以
(A*)*
的形式包含灾难性回溯的经典示例。在例如,在这一部分:
如果扔掉第二个分支,您将立即看到问题:
^{pr2}$第二个分支还包含问题模式的实例:
退化为:
要演示此问题,可以在此不匹配的字符串上测试正则表达式:
Demo on regex101
解决方案
使用上面的regex片段演示:
在支持所有格量词的语言中,由于正则表达式的两个分支是互斥的,因此可以选择将这些量词设为所有格。在
但是,由于Python不支持所有格量词,您可以在不影响结果的情况下删除标记位置的限定符,因为它已经由最外层的限定符处理。在
最终结果(处理最后一组的相同问题):
Demo on regex101
尝试:
在python3中,删除
xreadlines()
,因为file对象本身是一个迭代器。在相关问题 更多 >
编程相关推荐