測試工具: https://c.runoob.com/front-end/854/.
^
匹配字符串的開頭$
匹配字符串的末尾。.
匹配除 “\n” 之外的任何單個字符。要匹配包括 ‘\n’ 在內的任何字符,請使用象 ‘[.\n]’ 的模式。[...]
用來表示一組字符,單獨列出:[amk] 匹配 ‘a’,‘m’或’k’[^...]
不在[]中的字符:[^abc] 匹配除了a,b,c之外的字符。re*
匹配0個或多個的表達式。re+
匹配1個或多個的表達式。re?
匹配0個或1個由前面的正則表達式定義的片段,非貪婪方式re{n}
匹配n個前面表達式。例如,"o{2}“不能匹配"Bob"中的"o”,但是能匹配"food"中的兩個o。re{ n,}
精確匹配n個前面表達式。例如,"o{2,}“不能匹配"Bob"中的"o”,但能匹配"foooood"中的所有o。"o{1,}“等價於"o+”。"o{0,}“則等價於"o*”。re{ n, m}
匹配 n 到 m 次由前面的正則表達式定義的片段,貪婪方式`ab`(re)
匹配括號內的表達式,也表示一個組(?imx)
正則表達式包含三種可選標志:i, m, 或 x 。只影響括號中的區域。(?-imx)
正則表達式關閉 i, m, 或 x 可選標志。只影響括號中的區域。(?: re)
類似 (…), 但是不表示一個組(?imx: re)
在括號中使用i, m, 或 x 可選標志(?-imx: re)
在括號中不使用i, m, 或 x 可選標志(?#...)
注釋.(?= re)
前向肯定界定符。如果所含正則表達式,以 … 表示,在當前位置成功匹配時成功,否則失敗。但一旦所含表達式已經嘗試,匹配引擎根本沒有提高;模式的剩余部分還要嘗試界定符的右邊。(?! re)
前向否定界定符。與肯定界定符相反;當所含表達式不能在字符串當前位置匹配時成功。(?> re)
匹配的獨立模式,省去回溯。\w
匹配包括下劃線的任何單詞字符。等價於’[A-Za-z0-9_]'。\W
匹配任何非單詞字符。等價於 ‘[^A-Za-z0-9_]’。\s
匹配任何空白字符,包括空格、制表符、換頁符等等。等價於 [ \f\n\r\t\v]。\S
匹配任何非空白字符。等價於 [^ \f\n\r\t\v]。\d
匹配任意數字,等價於 [0-9]。\D
匹配一個非數字字符。等價於 [^0-9]。\A
匹配字符串開始\Z
匹配字符串結束,如果是存在換行,只匹配到換行前的結束字符串。\z
匹配字符串結束\G
匹配最後匹配完成的位置。\b
匹配一個單詞邊界,也就是指單詞和空格間的位置。例如, ‘er\b’ 可以匹配"never" 中的 ‘er’,但不能匹配 “verb” 中的 ‘er’。\B
匹配非單詞邊界。‘er\B’ 能匹配 “verb” 中的 ‘er’,但不能匹配 “never” 中的 ‘er’。\n, \t, 等。
匹配一個換行符。匹配一個制表符, 等\1...\9
匹配第n個分組的內容。\10
匹配第n個分組的內容,如果它經匹配。否則指的是八進制字符碼的表達式。\
轉義符(), (?:), (?=), []
圓括號和方括號*, +, ?, {n}, {n,}, {n,m}
限定符^, $, \任何元字符、任何字符
定位點和序列(即:位置和順序)import re
a = "abc123+-*"
b = re.findall('abc',a)
print(b)
s = "a123456b"
rule = "a[0-9][1-6][1-6][1-6][1-6][1-6]b" #這裡暫時先用這種麻煩點的方法,後面有更容易的,不用敲這麼多[1-6]
l = re.findall(rule,s)
print(l)
['a123456b']
s = "abcabcaccaac"
rule = "a[a,b,c]c" # rule = "a[a-z0-9][a-z0-9][a-z0-9][a-z0-9]c"
l = re.findall(rule, s)
print(l)
['abc', 'abc', 'acc', 'aac']
print(re.findall("caa[a,^]", "caa^bcabcaabc"))
['caa^']
print(re.findall("caa[^,a]", "caa^bcabcaabc"))
['caa^', 'caab']
print(re.findall("^abca", "abcabcabc"))
['abca']
print(re.findall("abc$", "accabcabc"))
['abc']
- \d:匹配任何十進制數等價於[0-9]
print(re.findall("c\d\d\da", "abc123abc"))
['c123a']
- \可以轉義成普通字符
print(re.findall("\^abc", "^abc^abc"))
['^abc', '^abc']
- \s:匹配任何的空白字符
print(re.findall("\s\s", "a c"))
[' ', ' ']
- \w匹配任何字母數字和下劃線,等價於[a-zA-Z0-9_]
print(re.findall("\w\w\w", "abc12_"))
['abc', '12_']
- {n}可以避免重復寫,比如前面我們用\w時寫了3次\w,而這裡我們這需要用用上{n}就可以,n表示匹配的次數
print(re.findall("\w{2}", "abc12_"))
['ab', 'c1', '2_']
- *表示匹配零次或多次(盡可能的多去匹配)
print(re.findall("010-\d*", "010-123456789"))
['010-123456789']
- +表示匹配一次或多次
print(re.findall("010-\d+", "010-123456789"))
['010-123456789']
- .用來操作除了換行符以外的任何字符
print(re.findall(".", "010\n?!"))
['0', '1', '0', '?', '!']
- ?表示匹配一次或零次
print(re.findall("010-\d?", "010-123456789"))
['010-1']
- 貪婪模式:盡可能多的去匹配數據,表現為\d後面加某個元字符,例如\d*
print(re.findall("010-\d*", "010-123456789"))
['010-123456789']
- 非貪婪模式:盡可能少的去匹配數據,表現為\d後面加?,例如\d?
print(re.findall("010-\d*?", "010-123456789"))
['010-']
- m,n指的是十進制數,表示最少重復m次,最多重復n次
print(re.findall("010-\d{3,5}", "010-123456789"))
['010-12345']
- 加上?表示盡可能少的去匹配
print(re.findall("010-\d{3,5}?", "010-123456789"))
['010-123']
靈活用法:
{1,} 相當於前面提過的 + 的效果
{0,1} 相當於前面提過的 ? 的效果
{0,} 相當於前面提過的 * 的效果
s = "010-123456789"
rule = "010-\d*"
rule_compile = re.compile(rule) #返回一個對象
# print(rule_compile)
s_compile = rule_compile.findall(s)
print(s_compile) #打印compile()返回的對象是什麼
['010-123456789']
- findall()
找到re匹配的所有字符串,返回一個列表- search()
掃描字符串,找到這個re匹配的位置(僅僅是第一個查到的)- match()
決定re是否在字符串剛開始的位置(匹配行首)
s = "010-123456789"
rule = "010-\d*"
rule_compile = re.compile(rule) # 返回一個對象
# print(rule_compile)
s_compile = rule_compile.match(s)
print(s_compile) # 打印compile()返回的對象是什麼
<re.Match object; span=(0, 13), match='010-123456789'>
- findall()
前面很多demo
- sub(正則,新字符串,原字符串)
s = "abcabcacc" #原字符串
l = re.sub("abc","ddd",s) #通過sub()處理過的字符串
print(l)
ddddddacc
- subn(正則,新字符串,原字符串)
s = "abcabcacc" #原字符串
l = re.subn("abc","ddd",s) #通過sub()處理過的字符串
print(l)
('ddddddacc', 2)
- split()
s = "abcabcacc"
l = re.split("b",s)
print(l)
['a', 'ca', 'cacc']