digoal
2021-07-09
PostgreSQL , 正则
视频回放: https://www.bilibili.com/video/BV11q4y1p7m1/
场景:
- 短文本(评论、客服交互、弹幕等)字符串清洗
挑战:
- 语言字符处理逻辑复杂, 例如常见的词组重复、字符重复要求去除, 数字可能重复但是又不能去除
PG解决方案
- 正则表达式, 快速清洗数据
- 数字: 不去重复
- 英文字母: 有3个以上连续词组或字符时去重
- 其他字符: 单个字符或词组重复时去重
例如:
贵很贵很贵很贵难道不是真的真的很贵很贵吗 不贵不贵1000!!!!!aaaaa
得到:
贵很贵难道不是真的很贵吗 不贵1000!a
正则表达式:
postgres=# select regexp_replace('贵很贵很贵很贵难道不是真的真的很贵很贵吗 不贵不贵1000!!!!!aaaaa', '(\W+)\1{1,}','\1','g');
regexp_replace
-----------------------------------------
贵很贵难道不是真的很贵吗 不贵1000!aaaaa
(1 row)
不知道能不能在1个表达式中完成,
postgres=# select regexp_replace('贵很贵很贵很贵难道不是真的真的很贵很贵吗 不贵不贵1000!!!!!aaaaa', '(\W+)\1{1,}|([A-Za-z_]+)\1{2,}','\1','g');
regexp_replace
-----------------------------------------
贵很贵难道不是真的很贵吗 不贵1000!aaaaa
(1 row)
两次搞定
select regexp_replace(regexp_replace('贵很贵很贵很贵难道不是真的真的很贵很贵吗 不贵不贵1000!!!!!aaaaa', '(\W+)\1{1,}','\1','g'), '([A-Za-z_]+)\1{2,}','\1','g');
贵很贵难道不是真的很贵吗 不贵1000!a
postgres=# select regexp_replace(regexp_replace('贵很贵很贵很贵难道不是真的真的很贵很贵吗 不贵不贵1000!!!!!aaaaa wordword nihaonihaonihao', '(\W+)\1{1,}','\1','g'), '([A-Za-z_]+)\1{2,}','\1','g');
regexp_replace
----------------------------------------------------
贵很贵难道不是真的很贵吗 不贵1000!a wordword nihao
(1 row)
https://github.com/qdlaoyao/js-regex-mini-book
https://zhuanlan.zhihu.com/p/29707385
http://c.biancheng.net/cpp/html/1438.html
https://cloud.tencent.com/developer/ask/114503
https://oomake.com/question/615920
https://cloud.tencent.com/developer/ask/56708/answer/94291
https://bbs.csdn.net/topics/40382529
https://blog.csdn.net/yohoph/article/details/7975520
https://www.imooc.com/wenda/detail/576729
https://www.postgresql.org/docs/14/functions-matching.html
您的愿望将传达给PG kernel hacker、数据库厂商等, 帮助提高数据库产品质量和功能, 说不定下一个PG版本就有您提出的功能点. 针对非常好的提议,奖励限量版PG文化衫、纪念品、贴纸、PG热门书籍等,奖品丰富,快来许愿。开不开森.