BigQuery中用RE2正则表达式精准去除长单词末尾句号
问题描述
需要去除句子中每个单词末尾的句号,但仅当该单词去掉末尾句号后的长度大于1时执行:
- 将“Spain.”改为“Spain”
- 保留“P.”不变
- 将“U.S.A.”改为“U.S.A”
- 将“S.S.”改为“S.S”
现有BigQuery代码对“Spain.”处理正常,但会错误地将“U.S.A.”修改为“US.A”,不符合预期,需适配各类带末尾句号的国家名或代码。
原错误代码
WITH t1 AS ( SELECT 'Spain. S.S. Spain.' sentence, 'Spain S.S Spain' expected UNION ALL SELECT 'U.S.A. S.S. Spain.', 'U.S.A S.S Spain' UNION ALL SELECT 'P. SMITH S.S. Spain.', 'P. SMITH S.S Spain' ) SELECT sentence, REGEXP_REPLACE(sentence,r'(\w+)(\.)(.+)','\\1\\3') AS actual, expected FROM t1;
问题分析
原正则表达式r'(\w+)(\.)(.+)'存在两处关键问题:
\w仅匹配纯单词字符(不包含.),无法识别“U.S.A.”这类含点的复合词- 匹配逻辑错误,会误替换复合词中间的句号,导致“U.S.A.”被破坏为“US.A”
解决方案
使用精准的正则表达式,仅替换非空白字符组成的长度≥2的序列末尾的句号(句号后为空格或字符串结尾),修改后的代码如下:
WITH t1 AS ( SELECT 'Spain. S.S. Spain.' sentence, 'Spain S.S Spain' expected UNION ALL SELECT 'U.S.A. S.S. Spain.', 'U.S.A S.S Spain' UNION ALL SELECT 'P. SMITH S.S. Spain.', 'P. SMITH S.S Spain' ) SELECT sentence, REGEXP_REPLACE(sentence, r'(\S{2,})\.(?=\s|$)', '\\1') AS actual, expected FROM t1;
正则规则说明
\S{2,}:匹配至少2个非空白字符,涵盖包含.的复合词(如“U.S.A”“S.S”)\.:匹配目标末尾句号(?=\s|$):正向断言,确保句号是单词的结尾(后面为空格或字符串结束)- 替换为
\1:保留匹配的字符序列,仅去掉末尾句号
修改后所有测试用例的实际输出将与预期完全一致。
内容的提问来源于stack exchange,提问作者dpl
相关产品推荐
相关产品推荐

