postgres中的regexp匹配后从列中提取信息

时间:2020-02-03 10:35:12

标签: regex postgresql match

我在postgres表中有以下一栏(col)。

col
uniprotkb:Q92843(protein(MI:0326), 9606 - Homo sapiens)
intact:EBI-4392836(peptide(MI:0327), -1 - In vitro)
chebi:CHEBI:132213(small molecule(MI:0328), -2 - Chemical synthesis (Chemical synthesis))
dip:DIP-24261N(protein(MI:0326), 9606 - Homo sapiens)
reactome:R-HSA-2089970(stable complex(MI:1302), 9606 - Homo sapiens)
refseq:NR_131157(lncrna(MI:2190), 9606 - Homo sapiens)
rnacentral:URS00004A7003_9606(rna(MI:0320), 9606 - Homo sapiens)
signor:SIGNOR-C173(stable complex(MI:1302), 9606 - Homo sapiens)
uniparc:UPI0000073D6C(protein(MI:0326), 9606 - Homo sapiens)

我正在此列上使用regexp_match函数以提取以下信息。

所需的列是:

col1       col2    col3     col4     col5
uniprotkb  Q92843  protein  MI:0326  Homo sapiens
intact     EBI-4392836  peptide  MI:0327 In vitro
chebi      CHEBI:132213 small molecule  MI:0328  Chemical synthesis (Chemical synthesis
dip        DIP-24261N   protein   MI:0326   Homo sapiens
reactome   R-HSA-2089970  stable complex  MI:1302   Homo sapiens
refseq     NR_131157      lncrna   MI:2190   Homo sapiens
rnacentral URS00004A7003_9606  rna  MI:0320  Homo sapiens
signor     SIGNOR-C173     stable complex  MI:1302  Homo sapiens
uniparc    UPI0000073D6C   protein  MI:0326   Homo sapiens

我在此列上应用了以下正则表达式:

regexp_match(col, '^[^\:]+') )[1]::varchar AS col1,
regexp_match(col2, '(^[^:]*:\s*)(.*)\(.*') )[2]::varchar AS col2

比赛后我得到以下专栏文章:

col1    col2
uniprotkb  Q92843(protein
intact     EBI-4392836(peptide  
chebi      CHEBI:132213(
dip:DIP-24261N(
reactome:R-HSA-2089970(
refseq:NR_131157(
rnacentral:URS00004A7003_9606(
signor:SIGNOR-C173(
uniparc:UPI0000073D6C(

我正在转义括号,但仍然将它们放在col2中。

这里的任何建议都会很有帮助

1 个答案:

答案 0 :(得分:0)

对于第二列,您可以像在第一种模式中一样使用否定的字符类([^()]+)来匹配除()以外的任何字符

匹配过多的原因是.*过度匹配,并将回溯直到字符串中最后一次出现(为止。

您可以使用非贪婪的版本.*?,但否定的字符类效率更高。

(^[^:]*:\s*)([^()]+)\(.*

Regex demo