python--“re”詳解
阿新 • • 發佈:2018-06-16
industry 等等 trie 大寫字母 反向 情況下 lar 限制 獲取
強調:1. 無論備選字符集包含多少字符,只能選1個
2. 必須選1個!
比如:6位數字的密碼: [0123456789][0123456789][0123456789][0123456789][0123456789][0123456789]
簡化:1. 當備選字符連續時,可用-表示範圍的區間
比如:[0123456789]-->[0-9]
[0-9][0-9][0-9][0-9][0-9][0-9]
[a-z]-->1位小寫字母
[A-Z]-->1位大寫字母
[A-Za-z]-->1位字母,大小寫都行
[0-9a-zA-Z]-->1位字母或數字都行
反選:[^不能選的字符列表]
比如:[^47] 強調:^作“除了”使用時,只能放在開頭
語法:X|Y 表達式X|Y等價於[XY] 2、預定義字符集
為常用的字符集專門提供的簡化寫法!
“\d”-->[0-9]-->1位數字 “\D”------一位非數字字符
“\w”-->[0-9a-zA-Z_]-->1位字母,數字或_ “\W”------匹配任何非單詞字符,等價於[^0-9a-zA-Z_]
“\s”-->1位空字符:匹配任何空白字符,包括空格、制表符、換頁符等等。等價於 [ \f\n\r\t\v]。 “\S”--------匹配非空白字符,等價於 [^\f\n\r\t\v] “\b”----匹配一個單詞邊界。比如,“er\b”可以匹配"never"中的"er",但不能匹配“verb”中的“er”。 “\B”--------匹配非單詞邊界。比如,"er\B"能匹配"verb"中的"er",但是不能匹配“never”中的“er ”
“ . “: 除換行回車外的任何一個字符,如:
. 3. 數量詞 :規定相鄰的字符集可出現的次數
確定數量:3種:
{n}--> 必須反復出現n位
{n,m}--> 最少出現n次,最多出現m次
{n,}-->至少出現n次,多了不限!
比如:/^\d{6}$/——6位數字
不確定數量:3種 * 大於等於0次 + 至少出現一次 ? 0次或1次 4. 指定匹配位置:
^表達式: 必須以表達式的規則為開頭
表達式$: 必須以表達式的規則為結尾
比如:選擇字符串開頭的空格?^\s*
選擇結尾空格?\s*$
選擇開頭或結尾的空格?^\s*|\s*$
*預告:今後只要在程序中執行驗證:都要前加^後加$*
表示從頭到尾完整匹配。
比如:test():
^\d{6}$——從頭到尾必須只能是6位數字
5.預判
(?=pattern) 非獲取匹配,正向肯定預查,在任何匹配pattern的字符串開始處匹配查找字符串,該匹配不需要獲取供以後使用。例如,“Windows(?=95|98|NT|2000)”能匹配“Windows2000”中的“Windows”,但不能匹配“Windows3.1”中的“Windows”。預查不消耗字符,也就是說,在一個匹配發生後,在最後一次匹配之後立即開始下一次匹配的搜索,而不是從包含預查的字符之後開始。
(?!pattern) 非獲取匹配,正向否定預查,在任何不匹配pattern的字符串開始處匹配查找字符串,該匹配不需要獲取供以後使用。例如“Windows(?!95|98|NT|2000)”能匹配“Windows3.1”中的“Windows”,但不能匹配“Windows2000”中的“Windows”。
(?<=pattern) 非獲取匹配,反向肯定預查,與正向肯定預查類似,只是方向相反。例如,“(?<=95|98|NT|2000)Windows”能匹配“2000Windows”中的“Windows”,但不能匹配“3.1Windows”中的“Windows”。 “(?<=95|98|NT|2000)Windows”目前在python3.6中re模塊測試會報錯,用“|”連接的字符串長度必須一樣,這裏“95|98|NT”的長度都是2,“2000”的長度是4,會報錯。
(?<!pattern) 非獲取匹配,反向否定預查,與正向否定預查類似,只是方向相反。例如“(?<!95|98|NT|2000)Windows”能匹配“3.1Windows”中的“Windows”,但不能匹配“2000Windows”中的“Windows”。這個地方不正確,有問題 .此處用或任意一項都不能超過2位,如“(?<!95|98|NT|20)Windows正確,“(?<!95|980|NT|20)Windows 報錯,若是單獨使用則無限制,如(?<!2000)Windows 正確匹配。 同上,這裏在python3.6中re模塊中字符串長度要一致,並不是一定為2,比如“(?<!1995|1998|NTNT|2000)Windows”也是可以的。
6.分組 ()括號裏面的內容當作一個分組,當做一個整體 比如:(a|bc)de 表示ade 或者cdef 7.貪婪模式和懶惰模式 貪婪模式:默認情況下,正則表達式會匹配最大的符合條件的字符串, *、+和?限定符都是貪婪的,因為它們會盡可能多的匹配文字,只有在它們的後面加上一個?就可以實現非貪婪或最小匹配。
一、什麽是正則表達式?
正則表達式(regular expression)描述了一種字符串匹配的模式,可以用來檢查一個串是否含有某種子串、將匹配的子串做替換或者從某個串中取出符合某個條件的子串等。
正則表達式的組件可以是單個的字符、字符集合、字符範圍、字符間的選擇或者所有這些組件的任意組合。
二、正則表達式的基本語法。
1.備選字符集
語法:[可選字符列表]強調:1. 無論備選字符集包含多少字符,只能選1個
2. 必須選1個!
比如:6位數字的密碼: [0123456789][0123456789][0123456789][0123456789][0123456789][0123456789]
簡化:1. 當備選字符連續時,可用-表示範圍的區間
比如:[0123456789]-->[0-9]
[0-9][0-9][0-9][0-9][0-9][0-9]
[a-z]-->1位小寫字母
[A-Z]-->1位大寫字母
[A-Za-z]-->1位字母,大小寫都行
[0-9a-zA-Z]-->1位字母或數字都行
反選:[^不能選的字符列表]
比如:[^47] 強調:^作“除了”使用時,只能放在開頭
語法:X|Y 表達式X|Y等價於[XY] 2、預定義字符集
“\d”-->[0-9]-->1位數字 “\D”------一位非數字字符
“\w”-->[0-9a-zA-Z_]-->1位字母,數字或_ “\W”------匹配任何非單詞字符,等價於[^0-9a-zA-Z_]
“\s”-->1位空字符:匹配任何空白字符,包括空格、制表符、換頁符等等。等價於 [ \f\n\r\t\v]。 “\S”--------匹配非空白字符,等價於 [^\f\n\r\t\v] “\b”----匹配一個單詞邊界。比如,“er\b”可以匹配"never"中的"er",但不能匹配“verb”中的“er”。 “\B”--------匹配非單詞邊界。比如,"er\B"能匹配"verb"中的"er",但是不能匹配“never”中的“er ”
“ . “: 除換行回車外的任何一個字符,如:
. 3. 數量詞
{n}--> 必須反復出現n位
{n,m}--> 最少出現n次,最多出現m次
{n,}-->至少出現n次,多了不限!
比如:/^\d{6}$/——6位數字
不確定數量:3種 * 大於等於0次 + 至少出現一次 ? 0次或1次 4. 指定匹配位置:
^表達式: 必須以表達式的規則為開頭
表達式$: 必須以表達式的規則為結尾
比如:選擇字符串開頭的空格?^\s*
選擇結尾空格?\s*$
選擇開頭或結尾的空格?^\s*|\s*$
*預告:今後只要在程序中執行驗證:都要前加^後加$*
表示從頭到尾完整匹配。
比如:test():
^\d{6}$——從頭到尾必須只能是6位數字
5.預判
在進行正式匹配正則表達式之前,先預讀整個字符串,進行初步匹配,如果預判都不能通過,則不再驗證。
(?:pattern) 非獲取匹配,匹配pattern但不獲取匹配結果,不進行存儲供以後使用。這在使用或字符“(|)”來組合一個模式的各個部分時很有用。例如“industr(?:y|ies)”就是一個比“industry|industries”更簡略的表達式。(?=pattern) 非獲取匹配,正向肯定預查,在任何匹配pattern的字符串開始處匹配查找字符串,該匹配不需要獲取供以後使用。例如,“Windows(?=95|98|NT|2000)”能匹配“Windows2000”中的“Windows”,但不能匹配“Windows3.1”中的“Windows”。預查不消耗字符,也就是說,在一個匹配發生後,在最後一次匹配之後立即開始下一次匹配的搜索,而不是從包含預查的字符之後開始。
(?!pattern) 非獲取匹配,正向否定預查,在任何不匹配pattern的字符串開始處匹配查找字符串,該匹配不需要獲取供以後使用。例如“Windows(?!95|98|NT|2000)”能匹配“Windows3.1”中的“Windows”,但不能匹配“Windows2000”中的“Windows”。
(?<=pattern) 非獲取匹配,反向肯定預查,與正向肯定預查類似,只是方向相反。例如,“(?<=95|98|NT|2000)Windows”能匹配“2000Windows”中的“Windows”,但不能匹配“3.1Windows”中的“Windows”。 “(?<=95|98|NT|2000)Windows”目前在python3.6中re模塊測試會報錯,用“|”連接的字符串長度必須一樣,這裏“95|98|NT”的長度都是2,“2000”的長度是4,會報錯。
(?<!pattern) 非獲取匹配,反向否定預查,與正向否定預查類似,只是方向相反。例如“(?<!95|98|NT|2000)Windows”能匹配“3.1Windows”中的“Windows”,但不能匹配“2000Windows”中的“Windows”。這個地方不正確,有問題 .此處用或任意一項都不能超過2位,如“(?<!95|98|NT|20)Windows正確,“(?<!95|980|NT|20)Windows 報錯,若是單獨使用則無限制,如(?<!2000)Windows 正確匹配。 同上,這裏在python3.6中re模塊中字符串長度要一致,並不是一定為2,比如“(?<!1995|1998|NTNT|2000)Windows”也是可以的。
6.分組 ()括號裏面的內容當作一個分組,當做一個整體 比如:(a|bc)de 表示ade 或者cdef 7.貪婪模式和懶惰模式 貪婪模式:默認情況下,正則表達式會匹配最大的符合條件的字符串, *、+和?限定符都是貪婪的,因為它們會盡可能多的匹配文字,只有在它們的後面加上一個?就可以實現非貪婪或最小匹配。
python--“re”詳解