正則表達式
學習資料:
為什么要學習正則表達式:在進行基因序列比對的時候,需要對每個基因的特定序列進行匹配、評分,匹配規則往往比較復雜,正則表達式可以高效的實現這一需求。
入門知識點:
- \b是正則表達式規定的一個特殊代碼(好吧,某些人叫它元字符,metacharacter),代表著單詞的開頭或結尾,也就是單詞的分界處。雖然通常英文的單詞是由空格,標點符號或者換行來分隔的,但是\b并不匹配這些單詞分隔字符中的任何一個,它只匹配一個位置。
舉例:從him,history,high,hi中查找hi這個單詞,需要使用的正則表達式為:\bhi\b
假如你要找的是hi后面不遠處跟著一個Lucy,你應該用\bhi\b.*\bLucy\b
*同樣是元字符,不過它代表的不是字符,也不是位置,而是數量——它指定*前邊的內容可以連續重復使用任意次以使整個表達式得到匹配。
0\d\d-\d\d\d\d\d\d\d\d匹配這樣的字符串:以0開頭,然后是兩個數字,然后是一個連字號“-”,最后是8個數字(也就是中國的電話號碼。當然,這個例子只能匹配區號為3位的情形)。
\d是個新的元字符,匹配一位數字(0,或1,或2,或……)。
-不是元字符,只匹配它本身
為了避免那么多煩人的重復,我們也可以這樣寫這個表達式:0\d{2}-\d{8}。這里\d后面的{2}({8})的意思是前面\d必須連續重復匹配2次(8次)。
元字符
代碼 | 說明 |
---|---|
. | 匹配除換行符以外的任意字符 |
\w | 匹配字母或數字或下劃線或漢字 |
\s | 匹配任意的空白符 |
\d | 匹配數字 |
\b | 匹配單詞的開始或結束 |
^ | 匹配字符串的開始 |
$ | 匹配字符串的結束 |
表1.常用的元字符
代碼 | 說明 |
---|---|
. | 匹配除換行符以外的任意字符 |
\w | 匹配字母或數字或下劃線或漢字 |
\s | 匹配任意的空白符 |
\d | 匹配數字 |
\b | 匹配單詞的開始或結束 |
^ | 匹配字符串的開始 |
$ | 匹配字符串的結束 |
字符轉義
特殊字符字符轉義符:\
主要用于解決*.等特殊字符在正則表達式中無法代表其自身的問題。
*表達方式: \*
.表達方式:\.
重復
代碼/語法 | 說明 |
---|---|
* | 重復零次或更多次 |
+ | 重復一次或更多次 |
? | 重復零次或一次 |
{n} | 重復n次 |
{n,} | 重復n次或更多次 |
{n,m} | 重復n到m次 |
表2.常用的限定符
代碼/語法 | 說明 |
---|---|
* | 重復零次或更多次 |
+ | 重復一次或更多次 |
? | 重復零次或一次 |
{n} | 重復n次 |
{n,} | 重復n次或更多次 |
{n,m} | 重復n到m次 |
字符類
要想查找數字,字母或數字,空白是很簡單的,因為已經有了對應這些字符集合的元字符,但是如果你想匹配沒有預定義元字符的字符集合(比如元音字母a,e,i,o,u)需要自己制定規則:如[aeiou]就匹配任何一個英文元音字母,[.?!]匹配標點符號(.或?或!)。
\(?0\d{2}[) -]?\d{8}
“(”和“)”也是元字符,后面的分組節里會提到,所以在這里需要使用轉義。
這個表達式可以匹配幾種格式的電話號碼,像(010)88886666,或022-22334455,或02912345678等。我們對它進行一些分析吧:首先是一個轉義字符(,它能出現0次或1次(?),然后是一個0,后面跟著2個數字(\d{2}),然后是)或-或空格中的一個,它出現1次或不出現(?),最后是8個數字(\d{8})。
分枝條件
正則表達式里的分枝條件指的是有幾種規則,如果滿足其中任意一種規則都應該當成匹配,具體方法是用|把不同的規則分隔開。其實就是將所有可能的正則表達式用|連接起來啦~
0\d{2}-\d{8}|0\d{3}-\d{7}這個表達式能匹配兩種以連字號分隔的電話號碼:一種是三位區號,8位本地號(如010-12345678),一種是4位區號,7位本地號(0376-2233445)。
注意:
使用分枝條件時,要注意各個條件的順序。
分組
用小括號來指定子表達式(也叫做分組),然后你就可以指定這個子表達式的重復次數了,你也可以對子表達式進行其它一些操作(后面會有介紹)。
(\d{1,3}.){3}\d{1,3}是一個簡單的IP地址匹配表達式。要理解這個表達式,請按下列順序分析它:\d{1,3}匹配1到3位的數字,(\d{1,3}.){3}匹配三位數字加上一個英文句號(這個整體也就是這個分組)重復3次,最后再加上一個一到三位的數字(\d{1,3})。
反義
有時需要查找不屬于某個能簡單定義的字符類的字符。比如想查找除了數字以外,其它任意字符都行的情況,這時需要用到反義:
代碼/語法 | 說明 |
---|---|
\W | 匹配任意不是字母,數字,下劃線,漢字的字符 |
\S | 匹配任意不是空白符的字符 |
\D | 匹配任意非數字的字符 |
\B | 匹配不是單詞開頭或結束的位置 |
[^x] | 匹配除了x以外的任意字符 |
[^aeiou] | 匹配除了aeiou這幾個字母以外的任意字符 |
表3.常用的反義代碼
代碼/語法 | 說明 |
---|---|
\W | 匹配任意不是字母,數字,下劃線,漢字的字符 |
\S | 匹配任意不是空白符的字符 |
\D | 匹配任意非數字的字符 |
\B | 匹配不是單詞開頭或結束的位置 |
[^x] | 匹配除了x以外的任意字符 |
[^aeiou] | 匹配除了aeiou這幾個字母以外的任意字符 |
例子:\S+匹配不包含空白符的字符串。
<a[^>]+>匹配用尖括號括起來的以a開頭的字符串。
以上是一些基礎類正則表達式,高級進階還請看鏈接腫作者給的更詳細的示例。強烈推薦看開頭的鏈接網站,真的是30分鐘入門正則表達式~
linux中可以使用grep配合正則表達式抓取符合一定特征的字符。
k-mer簡介
The term k-mer typically refers to all the possible substrings of length k that are contained in a string.
k-mer主要有以下一些用途:
- 糾錯:出現少的k-mer可能是測序錯誤
- 分類:一些特殊的k-mer可能鑒定基因組
- 偽比對:新的偽比對軟件可以直接利用常見的k-mer來定位reads
k-mer計算要遠遠快于序列比對,因此可以加快比對效率。
序列比對
序列比對是生物信息學最為核心的概念。
在顯示序列比對結果時,-代表空缺,|代表匹配,.代表錯配。示例:
ATGCAAATGACAAATAC
|||| |||.||.|
ATGC---TGATAACT--
如果沒有特殊說明,一般是用下面的序列和上面的序列進行比對,上面的結果說明序列有5個堿基缺失和2個堿基錯配。
ATGC---TGATAACT--
|||| |||.||.|
ATGCAAATGACAAATAC
這種序列比對結果說明序列有5個插入堿基和2個錯配堿基。
序列比對結果與評分規則有很大關系。
常用堿基匹配評分規則 EDNAFULL scoring matrix。
curl -O ftp://ftp.ncbi.nlm.nih.gov/blast/matrices/NUC.4.4
cat NUC.4.4
序列比對評分分為堿基(基因)匹配規則和蛋白匹配評分規則兩種。
序列比對結果和匹配規則的選取有很大關系。如果要深入了解,建議閱讀更多的參考資料。我也需要再深入學習一下。