Извлечение информации из столбца после совпадения регулярного выражения в postgres - PullRequest
0 голосов
/ 03 февраля 2020

У меня есть следующий столбец (столбец) в таблице postgres.

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(

Я избегаю скобок, но все еще получаю их в столбце 2.

Любые предложения здесь будут очень полезны

1 Ответ

0 голосов
/ 03 февраля 2020

Для второго столбца вы можете, как и в первом шаблоне, использовать класс отрицательных символов ([^()]+), соответствующий любому символу, кроме ( или )

Причина, по которой вы слишком много соответствует, заключается в том, что .* превышает соответствие и будет возвращаться до последнего появления ( в строке.

Вы можете использовать не жадную версию .*?, но класс отрицательных символов немного более эффективен.

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

Regex demo

...