使用 regexp_replace 命令时遇到问题

Posted

技术标签:

【中文标题】使用 regexp_replace 命令时遇到问题【英文标题】:Trouble using regexp_replace command 【发布时间】:2020-02-28 15:06:09 【问题描述】:

当前正在使用的命令:

regexp_replace(b.DOWNCASE_NAME, '[^\w\s]', '', 'g') as CONDITION_NAME_DC

这会将“卵巢支持细胞瘤”改为“卵巢支持细胞瘤”。它还将“遗传性乳腺癌/卵巢癌(brca1,brca2)”更改为“遗传性乳腺癌卵巢癌brca1 brca2”。

我不明白为什么它要删除“sertoli-leydig”中的破折号并将其放入一个单词中,而不是在两者之间保留一个空格。在 regexp_replace 中,如果我在 'g' 之前的 ' ' 中放置一个空格,那么它也会在“遗传性乳腺癌卵巢癌 brca1 brca2”中放置一个双空格

我不需要双倍空间,我只想要一个空间。有什么想法可以在这里做什么吗?

【问题讨论】:

它将“遗传性乳腺癌/卵巢癌 (brca1, brca2)”转换为“遗传性乳腺癌/卵巢癌 brca1 brca2”。请注意缺少空格。也许您的原件有一个空格和一个斜线? 【参考方案1】:

我不明白为什么它会删除“sertoli-leydig”中的破折号并将其放入一个单词中,而不是在两者之间保留一个空格。

因为那是你告诉它去做的。当你告诉它不要时,它为什么要在两者之间留一个空格?

用空格替换标点,但捕获标点周围已经存在的任何空格,以便它们也被该单个空格替换。

regexp_replace(b.DOWNCASE_NAME, ' *[^\w\s] *', ' ', 'g');

【讨论】:

天哪,你是救生员!非常感谢您的帮助,这很完美。在我的一生中,我无法理解这个 regexp_replace 命令,我花了数周时间试图弄清楚如何让东西在其中工作。再次感谢! @Preet 我认为部分问题是您没有正确看到函数的输入是什么。我不知道您使用的是什么工具,但也许您需要将其更改为使用固定宽度的字体,以便输入上的空格显示得更清楚。【参考方案2】:

您的RE(表 9-19。正则表达式类速记转义)说要删除不包含在 \w 或 \s 类中的所有内容。现在 \s 只是一个空格,\w 保留所有字母数字字符和下划线 (_),因此您的 RE 既不保留破折号 (-) 也不保留 (/)。扩展 RE 以同时保留这些字符:

with b (downcase_name) as
  (values ('ovarian sertoli-leydig cell tumor')
        , ('hereditary breast/ovarian cancer (brca1, brca2)')
  )
select downcase_name, regexp_replace(b.downcase_name, '[^\w\s\-/]', '', 'g') as name_dc
  from b; 

【讨论】:

以上是关于使用 regexp_replace 命令时遇到问题的主要内容,如果未能解决你的问题,请参考以下文章

regexp_replace 和 regexp_substr 变量的比较

为啥在使用 regexp_replace 时每个字符前后都有空格?

Pyspark 数据框中的 regexp_replace

PostgreSQL RETURNING 失败并出现 REGEXP_REPLACE

Bigquery 仅更新部分页面路径

Oracle SQL REGEXP_REPLACE - 除指定字符串外的所有内容