在正則表達式中,存在操做符和操做元,操做符存在優先級,操做元被稱作原子
操做符優先級(由高到低)
(先不用在乎操做符的名稱,雖然也看不太懂)python
1. 轉義符號 (Escaping Symbol): \ 2. 分組、捕獲 (Grouping or Capturing): (...) (?:...) (?=...) (?!...) (?<=...) (?<!...) 3. 數量 (Quantifiers) a* a+ a? a{n, m} 4. 序列與定位(Sequence and Anchor) abc ^ $ \b \B 5. 或(Alternation) a|b|c 6. 原子 (Atoms) a [^abc] \t \r \n \d \D \s \S \w \W .
1. 本義字符git
表明的就是它們的字面值,包括從 a 到 z,A 到 Z,0 到 9,還有 _
*注: 非本義字符:\ + . ? - ^ $ | ( ) [ ] { } < >,建議都直接加上轉義符號 \ 來表示**正則表達式
2 集合原子api
標示集合原子,使用方括號 []。
即[abc] 的意思是說,「a or b or c」,即,abc 中的任意一個字符。
在方括號中,咱們可使用兩個操做符:-(區間)和 ^(非)。ide
- [a-z] 表示從小寫字母 a 到小寫字母 z 中的任意一個字符。 - [^abc] 表示 abc 之外的其它任意字符,即,非 [abc]。 舉:beg[iau]n 可以表明 begin、began,以及 begun。
注:一個集合原子中,^ 符號只能用一次,只能緊跟在 [ 以後。不然不起做用google
3. 類別原子spa
可以表明 「一類字符」 的原子,它們都得使用轉義符號再加上另一個符號表達 \d 任意數字;等價於 [0-9] \D 任意非數字;等價於 [^0-9] \w 任意本義字符;等價於 [a-zA-Z0-9_] \W 任意非本義字符;等價於 [^a-zA-Z0-9_] \s 任意空白;至關於 [ \f\n\r\t\v](注意,方括號內第一個字符是空格符號) \S 任意非空白;至關於 [^ \f\n\r\t\v](注意,緊隨 ^ 以後的是一個空格符號) . 除 \r \n 以外的任意字符;至關於 [^\r\n]
小技巧:d 是 digits;w 是 word characters;s 是 spacesrest
# 舉例 import re str = '<dl>(843) 542-4256</dl> <dl>(431) 270-9664</dl>' # 找到字符串中全部"數字-數字"格式的字符,其中第一個數字是三位數,第二個數字是四位數 pttn = r'\d\d\d\-\d\d\d\d' print(re.findall(pttn, str)) # 輸出 ['542-4256', '270-9664']
4. 邊界原子code
用邊界原子指定邊界。也能夠稱做 「定位操做符」。blog
^ 匹配被搜索字符串的開始位置; $ 匹配被搜索字符串的結束位置; \b 匹配單詞的邊界;er\b,能匹配 coder 中的 er,卻不能匹配 error 中的 er; \B 匹配非單詞邊界;er\B,能匹配 error 中的 er,卻不能匹配 coder 中的 er。
注:^ 和 $ 在 Python 語言中被 \A 和 \Z 替代。
# 舉例 import re str = 'never ever verb however everest' pttn = r'er\b' print(re.findall(pttn, str)) pttn = r'er\B' print(re.findall(pttn, str)) # 輸出 ['er', 'er', 'er'] ['er', 'er']
5. 組合原子
用圓括號 () 將多個單字符原子組合成一個原子,() 內的字符串將被看成一整個原子
注意: er 是兩個原子,'e' 和緊隨其後的 'r' [er] 是一個原子,或者 'e' 或者 'r'; (er) 是一個原子,'er'
6. 數量操做符
數量操做符有:+ ? * {n, m}。用來限定位於它們以前的原子容許出現的個數,不加數量限定則表明出現一次且僅出現一次
+ 表明前面的原子必須至少出現一次,即: 出現次數 ≧ 1 ? 表明前面的原子最多隻能夠出現一次,即:0 ≦ 出現次數 ≦ 1 * 表明前面的原子能夠不出現,也能夠出現一次或者屢次,即: 出現次數 ≧ 0 {n} 表明以前的原子出現肯定的 n 次; {n,} 表明以前的原子出現至少 n 次; {n, m} 表明以前的原子出現至少 n 次,至多 m 次 # 匹配字符串 str = ['google', 'gooogle', 'goooogle', 'goooooogle'] # 遍歷字符串 for str_per in str: # o最少出現一次 pttn = r'go+gle' print(re.findall(pttn, str_per)) # o最多出現一次 pttn = r'go?gle' print(re.findall(pttn, str_per)) # o出現次數≧ 0 pttn = r'go?gle' print(re.findall(pttn, str_per)) # o出現至少2次,至多5次 pttn = r'go{2,5}gle' print(re.findall(pttn, str_per)) # 進階:聯立組合原子 # g 或者 o 最少出現一次 pttn = r'[go]+gle' # go 最少出現一次 pttn = r'(go)+gle' print(re.findall(pttn, str_per))
或操做符 | 是全部操做符中優先級最低的
import re str = 'begin began begun begins beginn' pttn = r'begin|began|begun' print(re.findall(pttn, str)) # 輸出 ['begin', 'began', 'begun', 'begin', 'begin']
注:方括號的 | 不被看成特殊符號,而是被看成 | 這個符號自己。在方括號中的圓括號,也被看成圓括號 () 自己,而無分組含義。
關於更多python進階知識,敬請期待!