我如何 select 所有非字母数字的记录并删除它们?
How can I select all records with non-alphanumeric and remove them?
我想 select 包含非字母数字的记录并从字符串中删除这些符号。我期望的结果是只有数字和字母的字符串。
我对正则表达式不是很熟悉,有时真的很困惑。下面的代码来自对类似问题的回答。但它也 returns 记录只有字母和 space。我还尝试使用 /s
以防某些 space 不是 space 而是制表符。但是我得到了相同的结果。
此外,我想删除除字母、数字和 space 之外的所有符号、字符。我从 google 中找到一个名为 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;
我建议使用 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.
我想 select 包含非字母数字的记录并从字符串中删除这些符号。我期望的结果是只有数字和字母的字符串。
我对正则表达式不是很熟悉,有时真的很困惑。下面的代码来自对类似问题的回答。但它也 returns 记录只有字母和 space。我还尝试使用 /s
以防某些 space 不是 space 而是制表符。但是我得到了相同的结果。
此外,我想删除除字母、数字和 space 之外的所有符号、字符。我从 google 中找到一个名为 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;
我建议使用 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.