PostgreSQL如何仅提取文本列中的主机名与路径名?
提取URL中的主机名和路径名(截止到.js文件)
可以用这个正则表达式来匹配你需要的URL部分:
\(?https?://[\w./-]+?\.js(?=:|\)|$)
正则各部分说明:
\(?:匹配URL前可能存在的左括号(有的行里URL被括号包裹,有的没有)https?://:匹配http://或https://,s?表示s是可选的[\w./-]+?\.js:匹配主机名、路径和.js文件名,[\w./-]包含字母、数字、下划线、点、斜杠、连字符;+?是非贪婪匹配,避免过度匹配到后面的行号内容(?=:|\)|$):正向预查,确保匹配到的.js后面紧跟的是冒号(行号开头)、右括号或者字符串结尾,精准截止到.js位置
使用示例(Python):
如果是用Python处理这些文本,可以结合正则提取并去重:
import re # 你的原始文本列表 raw_lines = [ " text2 (https://example.foo.com/url/path/site.js:1:44541)", " text2 (https://example.foo.com/url/path/site.js:1:44541)", " text2 https://example.foo.com/url/path/site.js:1:44541:1:25413)", " text2 (https://exampel2.fooo.io/unique/bundle.js:2:172704)", " text2 (ttps://exampel2.fooo.io/unique/bundle.js:2:173513)", " text2 https://exampel2.fooo.io/unique/bundle.js:2:171673", " text3 (https://exampel2.fooo.io/unique/bundle.js:2:171651)" ] # 正则模式 pattern = r"\(?https?://[\w./-]+?\.js(?=:|\)|$)" unique_urls = set() for line in raw_lines: matches = re.findall(pattern, line) for match in matches: # 移除可能的开头左括号 clean_url = match.lstrip('(') unique_urls.add(clean_url) # 输出结果 for url in sorted(unique_urls): print(url)
运行后会输出:
https://example.foo.com/url/path/site.js https://exampel2.fooo.io/unique/bundle.js
注意事项:
- 对于示例中出现的
ttps://(缺少h)的错误URL,上述正则不会匹配它。如果需要兼容这种笔误,可以将正则开头改为h?ttps?://,但根据你的目标结果,这部分应该是输入笔误,所以默认忽略。 - 如果是在数据库中处理(比如PostgreSQL的
regexp_match函数),可以调整用法,核心正则逻辑一致。
内容的提问来源于stack exchange,提问作者Gerg
相关产品推荐
相关产品推荐

