2

有没有办法将一列拆分为标记,并加入它们(就像你可以在其他编程语言中一样,如 Python、Java、Ruby)

我有一列包含诸如“ http://www.Yahoo.com ”之类的 URL,我想从中提取“Yahoo.com”(主域,而不是子域)。url 可以是以下形式:

我打算使用正则表达式在 http:// 之后和下一个斜杠之前提取所有内容。然后用句点 (.) 分割 url,然后加入最后 2 个标记。

使用正则表达式,我可以从http://www.yahoo.com中提取 www.yahoo.com 。通过拆分/连接,我可以从 www.yahoo.com 获取 yahoo.com。问题是我不知道如何使用 Postgres 进行拆分/连接。

有人知道方法吗?还是更好的选择?

4

3 回答 3

3

这不是您要求的方法,但应该得到您想要的:

vinod=# select * from table;
            url                
----------------------------------
 http://www.domain.com
 http://domain.com
 http://domain.com/page/page1
 http://www.domain.com/page/page2
 http://www.domain.com/
(5 rows)

vinod=# select substring(substring(url from 'http[s]*://([^/]+)') from '\w+\.\w+$') from table;
 substring  
------------
 domain.com
 domain.com
 domain.com
 domain.com
 domain.com
(5 rows)

内部substring命令提取整个域,外部substring命令提取最后两个片段。Postgresql 的 split 和 join 命令不如一般的脚本语言强大,所以如果可以的话,我倾向于在从 DB 中提取内容后执行此类操作。

于 2013-07-27T02:31:59.267 回答
0

您可以将它们与\w+.[^.]+$

http://www.domain.com -> domain.com
http://domain.com -> domain.com
http://domain.com/page/page1 -> domain.com/page/page1
http://www.domain.com/ -> domain.com/
http://www.domain.com/page/page2 -> domain.com/page/page2
于 2013-07-27T01:22:40.477 回答
0

将事物拆分为令牌可以通过多种方式完成:

  • regexp_split_to_table/regexp_split_to_array
  • string_to_array(对于简单的固定分隔符拆分)
  • 手动substring提取或substring(... from 'pattern')
  • 全文搜索to_tsvectorto_tsquery
  • 过程语言库,如 Perl 或 Python URL 库、用于自然语言处理的 Python + NLTK 等

在这种情况下,您可以使用正则表达式进行 URL 拆分,regexp_split_....这对于许多用途来说可能没问题 - 但可能不是这个。考虑:

  • 我的域,ringerc.id.au(即主”域)
  • www.ecu.edu.au(“主”域是ecu.edu.au
  • www.transperth.wa.gov.au(“主”域是transperth.wa.gov.au
  • tartarus.uwa.edu.au(“主”域是uwa.edu.au

祝你好运,使用正则表达式处理所有国家登记处和子登记处变体。使用适当的 URL 解析器来提取域,然后使用适当的域感知库来确定“主”域对于您的目的是什么。我建议使用 plperl 和orURL::Split模块URI开始。或者您想要的任何受支持的过程语言(Python、TCL 等)的 URL 解析器。然后为该语言找到一个合适的库,该库可以根据您想要的标准有意义地识别域和子域并使用它,而不仅仅是依赖于正则表达式。

加入时,您同样有很多选择:

  • array_to_string
  • string_agg
  • 连接||运算符
  • 过程语言字符串操作和库

对于 URL 工作,我再次建议使用具有适当本机 URL 库的 PL 来执行此操作。

于 2013-07-27T14:22:12.710 回答