正则表达式语法简介
参考资料:
https://www.runoob.com/regexp/regexp-tutorial.html
凌老师课件
新学期选修了一门自然语言处理(Natural Language Processing)课,第一周讲了三个内容:正则表达式(Regular Expression)、有限状态自动机(Finite State Automata)和分词(Word Segmentation)。这三个内容里最浅显易懂并且实用的就当属正则表达式了。本篇随笔就想着整理一下学到的东西,目的是让能够看懂RE而不是会写RE(因为根据不同的特定需求需要精心设置模式),这样以后要用到RE的时候就可以点开自己的博客,不必耗费多余的时间成本。废话少说,下面介绍:
语法是核心:
1. 析取
Letters inside square brackets[]
Pattern | Matches |
[wW]oodchuck | Woodchuck, woodchuck |
[1234567890] | Any digit |
Ranges[A-Z]
Pattern | Matches | |
[A-Z] | An upper case letter | Drenched Blossoms |
[a-z] | A lower case letter | my beans were impatient |
[0-9] | A single digit | Chapter 1: |
总结:析取的用法和方形中括号密切相关,在方形中括号内输入并列的几个单字符,或者,一个Ranges即范围。代表此处的字符是“或”的意义。
2. 否定
首先要科普一下,键盘上的这个符号“^”的英文名是Carat[ˈkærət]。这个Carat表示否定仅当它是方括号的第一个字符。否定的例子和析取非常像,直接看例子(其中后两个例子是^不表示否定的情况):
Pattern | Matches | |
[^A-Z] | Not an upper case letter | Oyfn pripetchik |
[^Ss] | Neither 'S' nor 's' | I have no exquisite reason |
[e^] | Either e or ^ | Look here |
a^b | The pattern a carat b | Look up a^b now |
3. 限定符
主要是'?'、'*'、'+'、'.',为突出本手册的简明性,直接举几个栗子
Pattern |
Matches |
|
colou?r |
Optional previous char |
color colour |
oo*h! |
0 or more of previous char |
oh! ooh! oooh! ooooh! |
o+h! |
1 or more of previous char |
oh! ooh! oooh! ooooh! |
baa+ |
baa baaa baaaa baaaaa |
|
beg.n |
begin begun begun beg3n |
总结:1)?表示前一个字符可有可无
2)* 表示前一个字符可以有0个或者多个
3)+ 表示前一个字符至少有一个
4). 表示该位置可以用匹配除\n和\r之外的任何字符
4. 锚号(Anchors)
锚号即定位符,能够匹配字符串特定位置的元素。^匹配字符串首,$匹配字符串末。
Pattern | Matches |
^[A-Z] | Palo Alto |
^[^A-Za-z] | 1 "Hello" |
\.$ | The end. |
.$ | The end? The end! |
以上四个就是最基本的语法,现在你已经能够理解很大一部分最简单的Pattern了,更多的复杂语法可以在参考资料一的菜鸟教程里查找到,日后有时间也会更新在这里。
2020年11月16日更新
今天用到了正则表达式的或逻辑。举个栗子:我们想匹配 明天前、明天之前、明天。自然的想法就是:明天肯定要有,后面必须跟上之前或者前,而后面的小尾巴是可有可无的。我们就可以这样来写:
明天(之前|前)?
这里有两个知识点,()表示子表达式。|表示或,?号大家都知道啦。