正則表達式基礎python
實驗介紹正則表達式
雖然咱們這一節的標題是正則表達式,但實際這一節實驗只是介紹grep,sed,awk這三個命令,而正則表達式做爲這三個命令的一種使用方式(命令輸出中能夠包含正則表達式)。正則表達式自己的內容不少,要把它說明清楚須要單獨一門課程來實現,不過咱們這一節中涉及到的相關內容一般也可以知足不少狀況下的需求了。編程
想要更深刻地學習使用正則表達式,在這裏 正則表達式基礎。markdown
1、正則表達式編程語言
什麼是正則表達式呢?編輯器
正則表達式,又稱正規表示式、正規表示法、正規表達式、規則表達式、常規表示法(英語:Regular Expression,在代碼中常簡寫爲 regex、regexp 或 RE),計算機科學的一個概念。正則表達式使用單個字符串來描述、匹配一系列符合某個句法規則的字符串。在不少文本編輯器裏,正則表達式一般被用來檢索、替換那些符合某個模式的文本。函數
許多程序設計語言都支持利用正則表達式進行字符串操做。例如,在 Perl 中就內建了一個功能強大的正則表達式引擎。正則表達式這個概念最初是由 UNIX 中的工具軟件(例如sed和grep)普及開的。正則表達式一般縮寫成「regex」,單數有 regexp、regex,複數有 regexps、regexes、regexen。工具
簡單的說形式和功能上正則表達式和咱們前面講的通配符很像,不過它們之間又有很大差異,特別在於一些特殊的匹配字符的含義上,但願初學者注意不要將二者弄混淆。性能
1. 舉例學習
假設咱們有這樣一個文本文件,包含"shiyanlou",和"shilouyan"這兩個字符串,一樣一個表達式:
shi*
若是這做爲一個正則表達式,它將只能匹配 shi,而若是不是做爲正則表達式*做爲一個通配符,則將同時匹配這兩個字符串。這是爲何呢?由於在正則表達式中*表示匹配前面的子表達式(這裏就是它前面一個字符)零次或屢次,好比它能夠匹配"sh","shii","shish","shiishi"等等,而做爲通配符表示匹配通配符後面任意多個任意字符,因此它能夠匹配"shiyanlou",和"shilouyan"兩個字符。
體驗完了,下面就來開始正式學習正則表達式吧。
2.基本語法:
一個正則表達式一般被稱爲一個模式(pattern),爲用來描述或者匹配一系列符合某個句法規則的字符串。
選擇
|豎直分隔符表示選擇,例如"boy|girl"能夠匹配"boy"或者"girl"
數量限定
數量限定除了咱們舉例用的*,還有+加號,?問號,.點號,若是在一個模式中不加數量限定符則表示出現一次且僅出現一次:
範圍和優先級
()圓括號能夠用來定義模式字符串的範圍和優先級,這能夠簡單的理解爲是否將括號內的模式串做爲一個總體。例如,"gr(a|e)y"等價於"gray|grey",(這裏體現了優先級,豎直分隔符用於選擇a或者e而不是gra和ey),"(grand)?father"匹配father和grandfather(這裏體驗了範圍,?將圓括號內容做爲一個總體匹配)。
語法(部分)
正則表達式有多種不一樣的風格,下面列舉一些經常使用的做爲 PCRE 子集的適用於perl和python編程語言及grep或egrep的正則表達式匹配規則:(因爲markdown表格解析的問題,下面的豎直分隔符用全角字符代替,實際使用時請換回半角字符)
PCRE(Perl Compatible Regular Expressions中文含義:perl語言兼容正則表達式)是一個用 C 語言編寫的正則表達式函數庫,由菲利普.海澤(Philip Hazel)編寫。PCRE是一個輕量級的函數庫,比Boost 之類的正則表達式庫小得多。PCRE 十分易用,同時功能也很強大,性能超過了 POSIX 正則表達式庫和一些經典的正則表達式庫。