资源|正则表达式的功法大全 做NLP再也不怕搞不定字元串了
消息来源:baojiabao.com 作者: 发布时间:2026-05-18

选自
Medium
作者
:
Jonny Fox
机器之心编译
参与:思源
在自然语言处理中,很多时候我们都需要从文本或字元串中抽取出想要的信息,并进一步做语义理解或其它处理。在本文中,作者由基础到高级介绍了很多正则表达式,这些表达式或规则在很多编程语言中都是通用的。
正则表达式(regex 或 regexp)对于从文本中抽取信息极其有用,它一般会搜索匹配特定模式的语句,而这种模式及具体的 ASCII 序列或 Unicode 字元。从解析/替代字元串、预处理数据到网页爬取,正则表达式的应用范围非常广。
其中一个比较有意思的地方是,只要我们学会了正则表达式的语句,我们几乎可以将其应用于多有的编程语言,包括 JavaScript、Python、Ruby 和 Java 等。只不过对于各编程语言所支持的最高级特征与语法有细微的区别。
下面我们可以具体讨论一些案例与解释。
基本语句
锚点:^ 和 $
2^The 匹配任何以“The”开头的字元串 -> Try it! (https://regex101.com/r/cO8lqs/
end$ 匹配以“end”为结尾的字元串
^The end$ 抽取匹配从“The”开始到“end”结束的字元串
roar 匹配任何带有文本“roar”的字元串
数量符:*、+、?和 {}
1 2 2 ,} 匹配在“ab”后面跟着两个或更多“c”的字元串 2 5 2 5 2 5 2 5abc* 匹配在“ab”后面跟着零个或多个“c”的字元串 -> Try it! (https://regex101.com/r/cO8lqs/
abc+ 匹配在“ab”后面跟着一个或多个“c”的字元串
abc? 匹配在“ab”后面跟着零个或一个“c”的字元串
abc{
abc{
abc{
a(bc)* 匹配在“a”后面跟着零个或更多“bc”序列的字元串
a(bc){
或运算符:| 、 []
3a(b|c) 匹配在“a”后面跟着“b”或“c”的字元串 -> Try it! (https://regex101.com/r/cO8lqs/
a[bc] 匹配在“a”后面跟着“b”或“c”的字元串
字元类:d、d、s 和 .
4 4 5d 匹配数字型的单个字元 -> Try it! (https://regex101.com/r/cO8lqs/
w 匹配单个词字(字母加下划线) -> Try it! (https://regex101.com/r/cO8lqs/
s 匹配单个空格字元(包括制表符和换行符)
. 匹配任意字元 -> Try it! (https://regex101.com/r/cO8lqs/
使用“.”运算符需要非常小心,因为常见类或排除型字元类都要更快与精确。d、w 和s 同样有它们各自的排除型字元类,即D、W 和S。例如D 将执行与d 完全相反的匹配方法:
6D 匹配单个非数字型的字元 -> Try it! (https://regex101.com/r/cO8lqs/
为了正确地匹配,我们必须使用转义符反斜杠“”定义我们需要匹配的符号“^.[$()|*+?{”,因为我们可能认为这些符号在原文本中有特殊的含义。
9$d 匹配在单个数字前有符号“$”的字元串 -> Try it! (https://regex101.com/r/cO8lqs/
注意我们同样能匹配 non-printable 字元,例如 Tab 符“ ”、换行符“
”和回车符“
”
Flags
我们已经了解如何构建正则表达式,但仍然遗漏了一个非常基础的概念:flags。
正则表达式通常以/abc/这种形式出现,其中搜索模式由两个反斜杠“/”分离。而在模式的结尾,我们通常可以指定以下 flag 配置或它们的组合:
g(global)在第一次完成匹配后并不会返回结果,它会继续搜索剩下的文本。
m(multi line)允许使用^和$匹配一行的开始和结尾,而不是整个序列。
i(insensitive)令整个表达式不区分大小写(例如/aBc/i 将匹配 AbC)。
中级语句
分组和捕获:()
11 12 17a(bc) 圆括弧会创建一个捕获性分组,它会捕获匹配项“bc” -> Try it! (https://regex101.com/r/cO8lqs/
a(?:bc)* 使用 “?:” 会使捕获分组失效,只需要匹配前面的“a” -> Try it! (https://regex101.com/r/cO8lqs/
a(?
捕获性圆括弧 () 和非捕获性圆括弧 (?:) 对于从字元串或数据中抽取信息非常重要,我们可以使用 Python 等不同的编程语言实现这一功能。从多个分组中捕获的多个匹配项将以经典的数组形式展示:我们可以使用匹配结果的索引访问它们的值。
如果需要为分组添加名称(使用 (?
方括弧表达式:[]
7 -9 16 22 0 -9 0 9 10[abc] 匹配带有一个“a”、“ab”或“ac”的字元串 -> 与 a|b|c 一样 -> Try it! (https://regex101.com/r/cO8lqs/
[a-c] 匹配带有一个“a”、“ab”或“ac”的字元串 -> 与 a|b|c 一样
[a-fA-F0
[
[^a-zA-Z] 匹配不带a到z或A到Z的字元串,其中^为否定表达式 -> Try it! (https://regex101.com/r/cO8lqs/
记住在方括弧内,所有特殊字元(包括反斜杠)都会失去它们应有的意义。
Greedy 和 Lazy 匹配
数量符(* + {})是一种贪心运算符,所以它们会遍历给定的文本,并尽可能匹配。例如,<.+> 可以匹配文本“This is a
24<.+?> 一次或多次匹配 “<” 和 “>” 里面的任何字元,可按需扩展 -> Try it! (https://regex101.com/r/cO8lqs/
注意更好的解决方案应该需要避免使用“.”,这有利于实现更严格的正则表达式:
23<[^<>]+> 一次或多次匹配 “<” 和 “>” 里面的任何字元,除去 “<” 或 “>” 字元 -> Try it! (https://regex101.com/r/cO8lqs/
高级语句
边界符: 和 B
25abc 执行整词匹配搜索 -> Try it! (https://regex101.com/r/cO8lqs/
如插入符号那样表示一个锚点(它与$和^相同)来匹配位置,其中一边是一个单词符号(如w),另一边不是单词符号(例如它可能是字元串的起始点或空格符号)。
它同样能表达相反的非单词边界“B”,它会匹配“”不会匹配的位置,如果我们希望找到被单词字元环绕的搜索模式,就可以使用它。
26BabcB 只要是被单词字元环绕的模式就会匹配 -> Try it! (https://regex101.com/r/cO8lqs/
前向匹配和后向匹配:(?=) 和 (?<=)
18 19d(?=r) 只有在后面跟着“r”的时候才匹配“d”,但是“r”并不会成为整个正则表达式匹配的一部分 -> Try it! (https://regex101.com/r/cO8lqs/
(?<=r)d 只有在前面跟着“r”时才匹配“d”,但是“r”并不会成为整个正则表达式匹配的一部分 -> Try it! (https://regex101.com/r/cO8lqs/
我们同样能使用否定运算子:
20 21d(?!r) 只有在后面不跟着“r”的时候才匹配“d”,但是“r”并不会成为整个正则表达式匹配的一部分 -> Try it! (https://regex101.com/r/cO8lqs/
(?* **Try it!* (https://regex101.com/r/cO8lqs/
结语
正如上文所示,正则表达式的应用领域非常广,很可能各位读者在开发的过程中已经遇到了它,下面是正则表达式常用的领域:
数据验证,例如检查时间字元串是否符合格式;
数据抓取,以特定顺序抓取包含特定文本或内容的网页;
数据包装,将数据从某种原格式转换为另外一种格式;
字元串解析,例如捕获所拥有 URL 的 GET 参数,或捕获一组圆括弧内的文本;
字元串替代,将字元串中的某个字元替换为其它字元。
原文链接:https://medium.com/factory-mind/regex-tutorial-a-simple-cheatsheet-by-examples-649dc1c3f285
本文为机器之心编译,
转载请联系本公众号获得授权
。?------------------------------------------------
加入机器之心(全职记者 / 实习生):hr@jiqizhixin.com
投稿或寻求报道:
content
@jiqizhixin.com广告 & 商务合作:bd@jiqizhixin.com
相关文章
B站怎么炸崩了哔哩哔哩服务器今日怎么又炸挂了?技术团队公开早先原因2023-03-06 19:05:55
苹果iPhoneXS/XR手机电池容量续航最强?答案揭晓2023-02-19 15:09:54
华为荣耀两款机型起内讧:荣耀Play官方价格同价同配该如何选?2023-02-17 23:21:27
google谷歌原生系统Pixel3 XL/4/5/6 pro手机价格:刘海屏设计顶配版曾卖6900元2023-02-17 18:58:09
科大讯飞同传同声翻译软件造假 浮夸不能只罚酒三杯2023-02-17 18:46:15
华为mate20pro系列手机首发上市日期价格,屏幕和电池参数配置对比2023-02-17 18:42:49
小米MAX4手机上市日期首发价格 骁龙720打造大屏标准2023-02-17 18:37:22
武汉弘芯遣散!结局是总投资1280亿项目烂尾 光刻机抵押换钱2023-02-16 15:53:18
谷歌GoogleDrive网云盘下载改名“GoogleOne” 容量提升价格优惠2023-02-16 13:34:45
巴斯夫将裁员6000人 众化工巨头裁员潮再度引发关注2023-02-13 16:49:06
人手不足 韵达快递客服回应大量包裹派送异常没有收到2023-02-07 15:25:20
资本微念与李子柒销声匿迹谁赢? 微念公司退出子柒文化股东2023-02-02 09:24:38
三星GalaxyS8 S9 S10系统恢复出厂设置一直卡在正在检查更新怎么办2023-01-24 10:10:02
华为Mate50 RS保时捷最新款顶级手机2022多少钱?1.2万元售价外观图片吊打iPhone142023-01-06 20:27:09
芯片常见的CPU芯片封装方式 QFP和QFN封装的区别?2022-12-02 17:25:17
华为暂缓招聘停止社招了吗?官方回应来了2022-11-19 11:53:50
热血江湖手游:长枪铁甲 刚猛热血 正派枪客全攻略技能介绍大全2022-11-16 16:59:09
东京把玩了尼康微单相机Z7 尼康Z7现在卖多少钱?2022-10-22 15:21:55
苹果iPhone手机灵动岛大热:安卓灵动岛App应用下载安装量超100万次2022-10-03 22:13:45
苹果美版iPhone可以在中国保修 从哪看怎么查询iPhone的生产日期?2022-09-22 10:00:07










