我在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中。
这里的任何建议都会很有帮助
答案 0 :(得分:0)
对于第二列,您可以像在第一种模式中一样使用否定的字符类([^()]+)
来匹配除(
或)
以外的任何字符
匹配过多的原因是.*
过度匹配,并将回溯直到字符串中最后一次出现(
为止。
您可以使用非贪婪的版本.*?
,但否定的字符类效率更高。
(^[^:]*:\s*)([^()]+)\(.*