正則表達式是用來處理字符串的強大工具,他並非某種編程雲。python
正則表達式擁有獨立的承受力引擎,無論什麼編程語言,正則表達式的語法都是同樣的。正則表達式
正則表達式的匹配過程編程
1.一次拿出表達式和文本中的字符比較。編程語言
2.若是每個字符都能匹配,則匹配成功;一旦有匹配不成功的字符則匹配失敗。工具
3.若是表達式中有兩次或便捷,這個過程會稍微有一些不一樣。spa
下面舉例一些符號對象
[....] blog
字符集(字符類)。對應的位置能夠是字符集中任意字符。字符集中的字符能夠豬哥列出,也能夠給出範圍,如[abc]或[a-c]。第一個字符若是是^則表示取反,若是[^abc]表示不是abc的其餘字符。全部的特殊字符在字符集中都是去某原有的特殊含義。在字符集中若是是用]、-或^,能夠在前面加上轉移字符反斜槓\,或把]、-放在第一個字符,把^放在非第一個字符。字符串
預約義字符集(能夠寫在字符集[....]中):編譯器
\d 數字:[0-9]
\D 非數字:[^\d]
\s 空白符:[<空格>\t\r\n\f\v]
\S 非空白符:[^\s]
\w 單詞字符:[A-Za-z0-9_]
\W 飛單詞字符:[^\w]
數量詞(用在字符或(...)以後)
* 匹配前一個字符0或無限次
+ 匹配前一個次1次或無限次
? 匹配前一個次0次或1次
{m} 匹配前一個字符m次
{m,n} 匹配前一個字符m至n次(多於n次則失敗)
m和n能夠省略:若省略m,則匹配0至n次;若省略n,則匹配m至無限次
邊界匹配(不消耗待匹配字符串中的字符)
^ 匹配字符串開頭。在多行模式中匹配每一行的開頭。
$ 匹配字符串末尾。在多行模時匹配每一行的末尾。
\A 僅匹配字符串開頭。
\Z 僅匹配字符串末尾。
\b 匹配\w和\W之間
\B [^\B]
邏輯、分組:
| 表明左右表達式任意匹配一個。(類比於C語言的或語句,它老是先匹配左邊的表達式,一旦成功匹配則跳過匹配右邊的表達式。若是|沒有被包括在()中,則它的範圍是整個正則表達式。)
(...) 被括起來的表達式將做爲分組,從表達式左邊開始沒遇到一個分組的左括號'(',編號+1.另外,分數表達式做爲一個總體,能夠后街數量詞。表達式中僅在該組中有效。
(?P<name>...) 分組,除了原有的編號外再指定一個額外的別名。
\<number> 引用編號爲<number>分組匹配到的字符串。
(?P=name) 引用別名爲<name>的分組匹配到的字符串。
特殊構造(不做爲分組):
(?:...) (...)的不分組版本,用於食用'|'或後接數量詞。
(?iLmsux) iLmsux的每一個字符表明一個匹配模式,只能用在正則表達式的開頭,可選多個。
(?#...) #後的內容將做爲註釋被忽略。
(?=...) 以後的字符串內容須要匹配表達式才能成功匹配。不消耗字符串內容。
(?!...) 以後的字符串內容須要不匹配表達式才能成功匹配。不消耗字符串。
(?<=...) 以前的字符串內容須要匹配表達式才能成功匹配。不消耗字符串內容。
(?<!...) 以前的字符串內容須要不匹配表達式才能成功匹配。不消耗字符串內容。
(?(id/name)yes-pattern|no-pattern) 若是編號爲id/別名爲name的組匹配到字符串,則須要匹配yes-pattern,不然須要匹配no-=attern。[no-pattern]可省略。
數量詞的貪婪模式與非貪婪模式
正則表達式一般用於在文本中查找匹配的字符串。
貪婪模式:老是嘗試撇皮儘量多的字符;(Python裏數量詞默認是貪婪的)
非貪婪模式:老是嘗試匹配儘量少的字符。(在貪婪模式的*或+後加上?,就變成了非貪婪模式)
python中如何使用正則表達式
python中是經過一個叫"re"的包來支持正則表達式。
結果以下:
咱們來分析一下pattern = re.compile(r'\d+\.\d*') 這個語句:
\d表示數字[0-9]
+表示重複出現上一次匹配的1次或n次
\.表示字符‘.’
*表示重複出現上一次匹配的0次或n次
r其實是python告訴編譯器這個字符串中的所有轉義字符失效,按照原始字符串處理。
因此\d+.\d*其實是表示匹配一些小數的規則。然而這個表達式並不能正確匹配全部的小數,好比'0.'這樣的字符也會被匹配,舉這個例子純粹是爲了多講幾個符號。
因爲咱們已經創建好了一個可以匹配'\d+.\d*'規則的pattern對象。
經過pattern的findall方法就可以匹配到咱們想要的字符串。
返回的是一個字符串列表[]。