我如何 select 所有非字母数字的记录并删除它们?

How can I select all records with non-alphanumeric and remove them?

我想 select 包含非字母数字的记录并从字符串中删除这些符号。我期望的结果是只有数字和字母的字符串。

我对正则表达式不是很熟悉,有时真的很困惑。下面的代码来自对类似问题的回答。但它也 returns 记录只有字母和 space。我还尝试使用 /s 以防某些 space 不是 space 而是制表符。但是我得到了相同的结果。

此外,我想删除除字母、数字和 space 之外的所有符号、字符。我从 google 中找到一个名为 removesymbols 的函数可以参考。但是好像根本就没有这个功能。网站介绍removesymbolshttps://cloud.google.com/dataprep/docs/html/REMOVESYMBOLS-Function_57344727。如何删除所有符号?我不想使用 replace 因为有很多符号而且我不知道它们有哪些非字母数字。

-- the code here only shows I want to select all records with non-alphanumeric
SELECT EMPLOYER
FROM fec.work
WHERE EMPLOYER NOT LIKE '[^a-zA-Z0-9/s]+'
GROUP BY 1;

我建议使用 REGEXP_REPLACE 代替 select,删除字符,并使用 REGEXP_CONTAINS 只得到你想要的字符。

SELECT REGEXP_REPLACE(EMPLOYER, r'[^a-zA-Z\d\s]', '') 
FROM fec.work
WHERE REGEXP_CONTAINS(EMPLOYER, r'[^a-zA-Z\d\s]')

你说你不想使用 replace 因为你不知道有多少字母数字。但不是列出所有非字母数字,为什么不使用 ^ 来获取除字母数字以外的所有内容?

编辑:

要完成 Mikhail 的回答,您的正则表达式有多种选择:

'[^a-zA-Z\d\s]'  // Basic regex
r'[^a-zA-Z\d\s]'   // Uses r to avoid escaping
r'[^\w\s]'         // \w = [a-zA-Z0-9_] (! underscore as alphanumerical !)

如果您不认为下划线是字母数字,则不应使用 \w

以下适用于 BigQuery 标准 SQL

SELECT 
  REGEXP_REPLACE(EMPLOYER, '[^a-zA-Z\d\s\t]', ''), -- option 1
  REGEXP_REPLACE(EMPLOYER, r'[^a-zA-Z\d\s\t]', ''),   -- option 2
  REGEXP_REPLACE(EMPLOYER, r'[^\w]', ''),             -- option 3
  REGEXP_REPLACE(EMPLOYER, r'\W', '')                 -- option 4
FROM fec.work

如您所见 - 选项 1 最冗长,您可以通过在字符串正则表达式前面使用 r 来避免双重转义,就像在选项 2
中一样 为了进一步简化 - 您可以使用 \w 或直接 \W 作为选项 3 和 4

Note: BigQuery provides regular expression support using the re2 library; see that documentation for its regular expression syntax.