Perl語(yǔ)言正則表達(dá)式使用案列一
最近一段時(shí)間沒有進(jìn)行公眾號(hào)文章更新,到不是因?yàn)闆]有新的內(nèi)容可以寫,其實(shí)做了一些注釋的分析,因?yàn)楸蛔⑨屲浖ASA給搞的有點(diǎn)焦慮,著實(shí)耽誤了我一些時(shí)間,為了趕點(diǎn)進(jìn)度,也懶得再去分享公眾號(hào)文章。PASA在安裝時(shí)太不友好,剛開始使用起來(lái)上手也不是很順利,下周找個(gè)時(shí)間分享一下PASA的安裝使用過(guò)程。今天在使用Augustus接著PASA的一個(gè)結(jié)果文件往下分析時(shí),使用到了正則,雖然略懂一些Perl,但這幾年太少親自寫腳本了,一下子看時(shí)沒能理解了是怎樣匹配處理想要的字符串并重新輸出的,有必要再去仔細(xì)查查強(qiáng)大的正則功能了。
定義:正則表達(dá)式是一種字符串模式,可用來(lái)和字符串進(jìn)行匹配。匹配可能成功,也可能失敗。許多UNIX命令,包括grep, sed, awk, ed, vi, emacs都有正則表達(dá)式的功能。
有這么一個(gè)格式的文件,

通過(guò)perl命令行:
cat train.err | perl -pe 's/.*in sequence (\S+): .*/$1/' >badgenes.lst
提取其中的一列信息,得到badgenes.list文件:

今天主要對(duì)正則中不同類型組合進(jìn)行學(xué)習(xí)。
下面對(duì)s/.*in sequence (\S+): .*/$1/ 進(jìn)行解析:
替換:s///這種形式表明正則表達(dá)式將被文本替換;
‘.’:換行符以外的任意字符;
重復(fù)符號(hào):multiplier,如星號(hào)(*)表示出現(xiàn)零次以上;加號(hào)(+)則表示出現(xiàn)一次以上;問(wèn)號(hào)(?)則表示出現(xiàn)零次或一次;
.*?代表一個(gè)通配符,它意味著“匹配任意字符(換行符除外)零次或多次”,也就是說(shuō)in sequence 前的任何字符匹配;
\S?匹配非空格字符(字符組合[/t/n]), \S+ 匹配非空格字符一次以上;
反向引用(),假定想保存一些匹配供后用,那么為達(dá)到該目的,Perl有一個(gè)運(yùn)算符(圓括號(hào)()),該運(yùn)算符可用于包圍讀者希望匹配的一系列給定的字符。
如果用圓括號(hào)括住一組字符,那么就可以在正則表達(dá)式結(jié)束之前使用反向引用。如果想在s”?”?“的第二部分(帶下劃線)中使用反向引用,那么要使用語(yǔ)法$1,$2等。如果想在m”?“或者s”?”?“的第一部分(帶下劃線)使用反向引用,那么使用語(yǔ)法/1/2等。
例子:
$string?=?‘?far?out’;
$string?=~?s?“(far)(out)”?$2?$1″;?#?This?makes?string?‘?out?far’.
在該例中將單詞far out轉(zhuǎn)換為out far。
總結(jié)一下這個(gè)正則的含義:.*匹配in sequence前內(nèi)容 + 匹配 in sequence + \S+匹配非空格字符一次以上也就是gi|687_106-210內(nèi)容并用反向引號(hào)()進(jìn)行保存 +? :.*匹配:及其后面的所有字符,$1進(jìn)行替換并輸出到新文件中。
補(bǔ)充學(xué)習(xí):
單正則使用:
單字符類型:?jiǎn)巫址愋褪亲畛R姾妥畛S玫念愋?。如a。單字符類型”.”能跟除換行符號(hào)(\n)的任何字符匹配。如
/a./
會(huì)和任何長(zhǎng)度為二,且開頭是a的字符串匹配,除了”a\n”外。
字符類:(character class),寫法是左右兩個(gè)中括號(hào)([]),內(nèi)放字符。即字符串對(duì)應(yīng)此類型的地方,若出現(xiàn)唯一一個(gè)符合括號(hào)中列出的字符,就算符合。
/[abcde]/
?/[aeiouAEIOU]/
若在中括號(hào)中放[或者],則需要在前面加反斜杠。如果想表示一段范圍,則可以用破折號(hào)(dash-)連接。想表示破折號(hào),則前面也必須加反斜杠。
[0123456789]
[0-9]
[0-9\-]
[a-zA-Z]
也可以用“反例”表示字符類別,只要在原來(lái)的寫法前加上“^”即可。此種類型的意思是任何不在此類別內(nèi)的單一字符才算上匹配。
[^0-9]
[^aeiouAEIOU]
預(yù)定義的字符類別

下面是這些通配符以及它們代表的含義和它們對(duì)應(yīng)的字符組合:
.\d —?匹配數(shù)字(字符組合[0-9])。
.\D —?匹配非數(shù)(字符組合[^0-9])。
.\w —?匹配單詞字符(字符組合[a-zA-Z0-9_])(這里下劃線算作一個(gè)單詞字符)。
.\W —?匹配非單詞字符(字符組合[^a-zA-Z0-9_])。
.\s —?匹配空格字符(字符組合[/t/n])(制表符、換行符、空格)。
.\S —?匹配非空格字符(字符組合[/t/n])。
.-?匹配任意字符(在某些情況下)換行符除外(字符組合[^/n])、當(dāng)輸入m”(.*)”S時(shí)匹配任意字符。
.$-?盡管它實(shí)際上并不是一個(gè)通配符(它不匹配任何具體字符).但它是廣泛使用的特殊字符;如果將其放在正則表達(dá)式的尾部則它匹配“行尾”。零寬度斷言。
.^-?盡管實(shí)際上不是一個(gè)通配符,但如果它位于正則表達(dá)式的開頭則它是匹配“行首”的特殊字符。
./b,/B-?與$和^相同;不匹配字符,但匹配單詞邊界(/b)或匹配無(wú)單周邊(/B)。
參考:
http://www.blogjava.net/ruoyoux/articles/253084.html
https://javaforall.cn/138204.html
本文使用 文章同步助手 同步