0

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

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

另外,我想删除除字母、数字和空格之外的所有符号、字符。我发现一个从谷歌命名的函数removesymbols可以参考。但似乎这个功能根本不存在。该网站介绍removesymbols的是https://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;
4

2 回答 2

2

以下是 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 中一样
为了进一步简化 - 您可以使用\wor 直接\W在选项 3 和 4 中

注意:BigQuery 使用re2库提供正则表达式支持;请参阅该文档以了解其正则表达式语法。

于 2019-07-25T16:12:21.763 回答
0

我建议使用REGEXP_REPLACEfor 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

于 2019-07-25T14:58:47.460 回答