正则表达式

最近在学正则表达式,整理出来放在这里。

### 什么是正则表达式
正则表达式本质上是一种用来描述字符串的记号系统。用来方便的表示一个或一类字符串。
正则表达式可以应用在几乎所有需要文本匹配的地方,像是在程序中判断输入是否合法,从网址中抽取需要的一部分等等。linux终端的命令诸如`grep`, `sed`都是支持正则的,绝大多数编程语言也支持,或是有相应的库支持正则。像sublime和atom等等编辑器也都支持在搜索和替换的时候使用正则表达式。

### 简单的例子
我就用手边的一个fasta文件做例子,里面存的是ATGC构成的DNA序列。
```
cat sample.fasta
CGCGCCAGTCTTGGGTTTGCAGGGTGAGTTGCAGTCCGTAGGCTTGGGCAAGGGTGTCGCGGATTTTGTCGAGACGTTTT
TTGTCGGCGGTGGCGCGGGCTTCGGCGGTCATCGCCAAAACCATCAGGCCGGTGTCGGGATGGTATTCCGTCCACGCGGA
GTGTTGCGCCGGCATTTGCGCCGCGCCGAGTTTGCGGGCGAAATGCCGGACGATGGCTGCCCAGTTTTCGGTGGAAAATT
CGGGCGGCGGGGCGGACGGCGTGTTGTTTCCGCCGATGCCGCCTGCTTCTGCTTCTTCGTCCGCGCCTCCGCCTGCGGTA
TCGGCAGGGGCGGCGTGTTCCCAATCGGGCGGCGGGATTTCTGCGCCGTCTTCTACGGGGCAGTCATTATCCGGAAAGCC
GTAACCGTAGAAAGGTTCTGCAGGGGCTTCGTGTGCAAATGTTTCCGTTTCAACGGCTTCATCATTCGGTGTTGCCTGAA
TGGGGTTTTCAGACGGCACTTCGGACAAGGGGGCATCGGTTACGTTGTCGGCTGCCTTGTTCTTGGAAACTTGGTTTTCG
GGCGGCGTTTCGGCTTCGGATGCCGTCTGAATGCTTTTTGCCGACGTTTGCGCCGTGCCGGCTGCGGCTTGGGCTTCGTC
TGGCGCGTCTTCCCAAGGCGGAACATCGTTGTTTTCTTGATTGGAAACGGGTCCGGCAGTTTTGCCTTCAGACGGCATTG
CCGCTGCGGATGCCGTCTGAACGGGTGTTTGGGCGGTTTCTGCTTCAGGGCGCGGTTGGGGCTTTTTTACGGCGGTTTCC
```
我就用grep在文件中搜索做例子,手边有sublime/atom的话也可以直接在软件里面搜索。(grep 开启color参数方便查看)
```
grep --color ATGC sample.fasta
GTGTTGCGCCGGCATTTGCGCCGCGCCGAGTTTGCGGGCGAAATGCCGGACGATGGCTGCCCAGTTTTCGGTGGAAAATT
CGGGCGGCGGGGCGGACGGCGTGTTGTTTCCGCCGATGCCGCCTGCTTCTGCTTCTTCGTCCGCGCCTCCGCCTGCGGTA
GGCGGCGTTTCGGCTTCGGATGCCGTCTGAATGCTTTTTGCCGACGTTTGCGCCGTGCCGGCTGCGGCTTGGGCTTCGTC
CCGCTGCGGATGCCGTCTGAACGGGTGTTTGGGCGGTTTCTGCTTCAGGGCGCGGTTGGGGCTTTTTTACGGCGGTTTCC
# 严格匹配序列“ATGC”

grep --color AT*GC sample.fasta | head -2
GTGTTGCGCCGGCATTTGCGCCGCGCCGAGTTTGCGGGCGAAATGCCGGACGATGGCTGCCCAGTTTTCGGTGGAAAATT
CGGGCGGCGGGGCGGACGGCGTGTTGTTTCCGCCGATGCCGCCTGCTTCTGCTTCTTCGTCCGCGCCTCCGCCTGCGGTA
TCGGCAGGGGCGGCGTGTTCCCAATCGGGCGGCGGGATTTCTGCGCCGTCTTCTACGGGGCAGTCATTATCCGGAAAGCC
GGCGGCGTTTCGGCTTCGGATGCCGTCTGAATGCTTTTTGCCGACGTTTGCGCCGTGCCGGCTGCGGCTTGGGCTTCGTC
CCGCTGCGGATGCCGTCTGAACGGGTGTTTGGGCGGTTTCTGCTTCAGGGCGCGGTTGGGGCTTTTTTACGGCGGTTTCC
# 匹配序列 “A”+任意个”T“+”GC“

grep "AT{1,5}" sample.fasta
CGCGCCAGTCTTGGGTTTGCAGGGTGAGTTGCAGTCCGTAGGCTTGGGCAAGGGTGTCGCGGATTTTGTCGAGACGTTTT
TTGTCGGCGGTGGCGCGGGCTTCGGCGGTCATCGCCAAAACCATCAGGCCGGTGTCGGGATGGTATTCCGTCCACGCGGA
GTGTTGCGCCGGCATTTGCGCCGCGCCGAGTTTGCGGGCGAAATGCCGGACGATGGCTGCCCAGTTTTCGGTGGAAAATT
CGGGCGGCGGGGCGGACGGCGTGTTGTTTCCGCCGATGCCGCCTGCTTCTGCTTCTTCGTCCGCGCCTCCGCCTGCGGTA
TCGGCAGGGGCGGCGTGTTCCCAATCGGGCGGCGGGATTTCTGCGCCGTCTTCTACGGGGCAGTCATTATCCGGAAAGCC
GTAACCGTAGAAAGGTTCTGCAGGGGCTTCGTGTGCAAATGTTTCCGTTTCAACGGCTTCATCATTCGGTGTTGCCTGAA
TGGGGTTTTCAGACGGCACTTCGGACAAGGGGGCATCGGTTACGTTGTCGGCTGCCTTGTTCTTGGAAACTTGGTTTTCG
GGCGGCGTTTCGGCTTCGGATGCCGTCTGAATGCTTTTTGCCGACGTTTGCGCCGTGCCGGCTGCGGCTTGGGCTTCGTC
TGGCGCGTCTTCCCAAGGCGGAACATCGTTGTTTTCTTGATTGGAAACGGGTCCGGCAGTTTTGCCTTCAGACGGCATTG
CCGCTGCGGATGCCGTCTGAACGGGTGTTTGGGCGGTTTCTGCTTCAGGGCGCGGTTGGGGCTTTTTTACGGCGGTTTCC
# 匹配 “A” 后面跟1~5个 “T”。 这里的""是为了给大括号转义。
```

### 在`python`中使用正则表达式
python中有一个库就叫re(regular expression)。正则相关的函数都在里面。
`re.match`函数判断pattern和string是否匹配,如果是,返回的是一个`match`对象,不匹配则返回`None`。所以简单判断是不是匹配就看返回是不是None就可以。
```
# 判断是不是合法的大陆手机号
>>>import re
>>>re.match(r"d{11}", "18800008888")

>>>re.match(r"d{11}", "4008823823")
>>>
```
pattern用的是raw string,这样可以避免需要频繁的使用转义字符的麻烦。

### 正则表达式语法:

`|,[,],{,},(,),,^,$,*,+,.`这些字符在正则表达式里面是有特殊含义的字符。普通字符直接写出来就是精确匹配。比如说“ATGC”就是精确匹配”ATGC“。

###### 括号:
中括号`[]`表示一个字符的一组可能的取值。如果`^`出现在中括号内,则表示对整个串的否定。例如:

1. `[a-z]`表示任何一个小写字母
2. `[A-Z]`表示任何一个大写字母
3. `[^a-z]`表示不是小写字母

`{m, n}` 花括号表示重复,括号里面是重复的次数,最少m次,最多n次。注意重复只对花括号前的一个字符有效。例如:

1. `ab{3}` 表示abbb,恰好3个b
2. `a{4,}` 表示最少4个a
3. `a{,4}` 表示0-4个a,a可以不存在

`()` 小括号表示其他部分的组合。特别的,前面说过的其他控制字符都是针对一个字符,用括号来使其应用到多个字符上。

###### 转义字符:
```
d 数字
s whitespace
w word or character
D not digit
S not whitespace
W not word nor character
```
在任何特殊字符前面加``会将其转换回普通字符。

###### 位置控制
```
^ 表示整个串的最前方
$ 表示整个串的最后方
```
###### 通配符
匹配任何一个字符: `.`
次数通配符:下面三个字符只用来匹配它前面的字符的重复次数。
```
{0, 1} => ?
{0, } => *
{1, } => +
```

###### 逻辑
`|`表示逻辑或。

##### 在python中使用正则表达式
未完待续

Leave a Reply

Your email address will not be published. Required fields are marked *