Tengo la siguiente tabla en postgres.
col1 col2 col3 NCT00000412 Drug Placebo Calcitriol NCT00000412 Drug Placebo Alendronate NCT00000774 Biological Placebo version of rgp120/HIV-1MN NCT00000774 Biological Placebo version of rgp120/HIV-1SF2 NCT00005648 Drug Gemcitabine with Placebo NCT00007631 Drug Tretinoin 0.1% cream or placebo NCT00007735 Drug Doxycycline (200mg/day) or Placebo NCT00032435 Drug PAL-40 Placebo NCT00032435 Drug abciximab placebo; reteplase placebo, abciximab NCT00032435 Drug Valsartan placebo + nateglinide placebo
Estoy tratando de extraer esas filas donde la palabra placebo tiene una sola palabra antes o después. La salida esperada es:
col1 col2 col3 NCT00000412 Drug Placebo Calcitriol NCT00000412 Drug Placebo Alendronate NCT00032435 Drug PAL-40 Placebo
He intentado siguiendo expresiones regulares:
select * from table where name ~* '\splacebo\w+' or name ~* '\w+placebo\s'
Puedes utilizar
select * from table where name ~* '^(?:placebo\s+\S+|\S+\s+placebo)$'
Vea la demostración de expresiones regulares
Detalles
^
- comienzo de la cadena(?:placebo\s+\S+|\S+\s+placebo)
- un grupo sin captura que coincide conplacebo\s+\S+
- placebo
, luego 1+ espacios en blanco y luego 1+ espacios que no son en blanco|
- o\S+\s+placebo
- 1+ espacios sin espacios en blanco, luego 1+ espacios en blanco y luego placebo
$
- final de la cadena.Creo que quieres:
where col3 ~* '(^\S+\s+placebo)|(placebo\s+\S+$)'
Desglose:
( ^ beginning of the string \S+ 1 to N characters other than a space \s+ 1 to N spaces placebo literal string "placebo" ) | OR ( placebo literal string "placebo" \s+ 1 to N spaces \S+ 1 to N characters other than a space $ end of the string )
Usé \S
en lugar de \w
porque quieres hacer coincidir los guiones (lo que \w
no hace).
Como nota, puedes hacer esto simplemente usando like
:
where (name like '% Placebo%' and name not like '% % Placebo%') or (name like '%Placebo %' and name not like '%Placebo % %')