. \w \s \d a|b () [...] {} * +
1. 常用元字符
. 匹配除換行符以外的任意字符
\w 匹配字母或數(shù)字或下劃線
\s 匹配任意的空白符
\d 匹配數(shù)字
\n 匹配一個(gè)換行符
\t 匹配一個(gè)制表符
^ 匹配字符串的開(kāi)始
$ 匹配字符串的結(jié)尾
\W 匹配非字母或數(shù)字或下劃線
\D 匹配非數(shù)字
\S 匹配非空白符
a|b 匹配字符a或字符b
() 匹配括號(hào)內(nèi)的表達(dá)式,也表示一個(gè)組
[...] 匹配字符組中的字符
[^...] 匹配除了字符組中字符的所有字符
2. 量詞:控制前面的元字符出現(xiàn)的次數(shù)
* 重復(fù)零次或更多次
+ 重復(fù)一次或更多次
? 重復(fù)零次或一次
{n} 重復(fù)n次
{n,} 重復(fù)n次或更多次
3. 貪婪匹配和惰性匹配
.* 貪婪匹配
.*? 非貪婪匹配
'''
點(diǎn): 匹配所有不包括換行
+: 表示重復(fù)一次或者更多次,就是說(shuō)如果條件一直符合的話,就連續(xù)匹配
import re
def test_dot():
data1 = 'hello \n world'
pattern = re.compile(r'.+')
res_list = pattern.findall(data1)
assert ['hello ', ' world'] == res_list, 're dot error'
2.點(diǎn): 匹配所有包括換行
import re
def test_dot2():
# 有時(shí)候需要 . 能匹配所有字符,包括換行符, 就需要帶上參數(shù) re.S
data1 = ''
# (.+) 括號(hào)說(shuō)明: 正常會(huì)取整個(gè),加括號(hào)之后,就只取括號(hào)里面的了
ptn = re.compile(r'', re.S)
res_list = ptn.findall(data1)
assert ['hello \n world'] == res_list, 're dot 2 error'
3. \w: 匹配數(shù)字、字母 和 下劃線
import re
def test_w():
data1 = 'ab_@.121'
# + 表示重復(fù)一次或者更多次,就是說(shuō)如果條件一直符合的話,就連續(xù)輸出,比如:ab_
ptn = re.compile(r'\w+')
res_list = ptn.findall(data1)
assert ['ab_', '121'] == res_list, 're w error'
4.\s: 匹配任意的空白字符
import re
def test_s():
data1 = 'a b\tc\n d$#'
ptn = re.compile(r'\s+')
res_list = ptn.findall(data1)
assert [' ', '\t', '\n '] == res_list, 're s error'
5.\d: 匹配數(shù)字
import re
def test_d():
data1 = 'yidong 10086,liantong 10010'
ptn = re.compile(r'\d+')
res_list = ptn.findall(data1)
assert ['10086', '10010'] == res_list, 're d error'
6.^: 有兩個(gè)地方用到: 1.本例中的匹配字符串的開(kāi)始, 2. 在中括號(hào)中,取非
import re
def test_start():
data1 = 'ab1ab2'
ptn = re.compile(r'ab\d')
res_list = ptn.findall(data1)
assert ['ab1', 'ab2'] == res_list, 're ^ error'
# ^ 表示只匹配字符串的開(kāi)始
data1 = 'ab1ab2'
ptn = re.compile(r'^ab\d')
res_list = ptn.findall(data1)
assert ['ab1'] == res_list, 're ^ 2 error'
7.$: 匹配字符串的結(jié)束
import re
def test_end():
data1 = '1ab2ab'
ptn = re.compile(r'\dab$')
res_list = ptn.findall(data1)
assert ['2ab'] == res_list, 're $ error'
8. |: a|b 匹配字符串a(chǎn)或字符串b
import re
def test_and():
data1 = '12a_3$dc'
ptn = re.compile(r'\d+|a|d|c')
res_list = ptn.findall(data1)
assert ['12', 'a', '3', 'd', 'c'] == res_list, 're | error'
9. (): 表示一個(gè)組
import re
def test_bracket():
data1 = ''
ptn = re.compile(r'')
res_list = ptn.findall(data1)
assert ('1', 'xiaoxinmiao') == res_list[0], 're () error'
10. (): 可以通過(guò)?P定義組名
import re
def test_bracket2():
# 可以設(shè)置分組名
data1 = ''
ptn = re.compile(r'')
iter_obj = ptn.finditer(data1)
res_obj = iter_obj.__next__()
assert '1' == res_obj.group(
'id') and 'xiaoxinmiao' == res_obj.group('name'), 're () error'
11.(): 當(dāng)有多組時(shí)的例子, 當(dāng)然這種情況,直接用例子9更方便
import re
def test_bracket3():
# 可以設(shè)置分組名
data1 = ''
ptn = re.compile(
r'')
iter_obj = ptn.finditer(data1)
ids, names = [], []
for i in iter_obj:
ids.append(i.group('id'))
names.append(i.group('name'))
assert ['1', '2'] == ids and ['miao1', 'miao2'] == names, 're () error'
12.[]: 匹配字符串中的字符, 其中 - 表示區(qū)間,例如:1-9表示1,2,3,4,5,6,7,8,9
import re
def test_bracket_mid():
data1 = '12dss#$$fwe564_'
ptn = re.compile(r'[1-9a-z_$]+')
res_list = ptn.findall(data1)
assert ['12dss', '$$fwe564_'] == res_list, 're [] error'
13.[^]: 匹配除了字符串中的值
import re
def test_bracket_mid2():
data1 = '12dss#$$fwe564_'
# [^] 表示不匹配里面的任何數(shù)
ptn = re.compile(r'[^1-9a-z_$]+')
res_list = ptn.findall(data1)
assert ['#'] == res_list, 're [] error'
14. +, * , ? 的理解,但是并不常用, 最常用的還是這個(gè)組合 .*?
def test_liangci():
data1 = 'abccd'
# +: 前一個(gè)字符出現(xiàn)1次或者多次
re_list = re.findall(r'abc+', data1)
assert ['abcc'] == re_list, 're + error'
# *: 前一個(gè)字符出現(xiàn)0次或者多次
re_list = re.findall(r'abf*', data1)
assert ['ab'] == re_list, 're + error'
# ?: 前一個(gè)字符出現(xiàn)0次或者1次
re_list = re.findall(r'abc?', data1)
assert ['abc'] == re_list, 're + error'
16. .*?: 非貪婪模式, 直接看例子
import re
def test_star2():
# .* 貪婪
data1 = '我愛(ài)北京天安門(mén),天安門(mén)上太陽(yáng)升.'
res_list = re.findall(r'我愛(ài)(.*)天安門(mén)', data1)
assert ['北京天安門(mén),'] == res_list, 're .* error'
# .*? 非貪婪
res_list = re.findall(r'我愛(ài)(.*?)天安門(mén)', data1)
assert ['北京'] == res_list, 're .* error'
17. {}: {n}重復(fù)多次,{n,}重復(fù)多次或者更多次
import re
def test_bracket_big():
# 只有兩位數(shù)字才符合要求
data1 = 'a1b12c134d1234e'
res_list = re.findall(r'\d{2}', data1)
assert ['12', '13', '12', '34'] == res_list, r're {} error'
# 兩位,以及兩位以上的數(shù)字都符合要求
data1 = 'a1b12c134d1234e'
res_list = re.findall(r'\d{2,}', data1)
assert ['12', '134', '1234'] == res_list, r're {} error'
18. []: 實(shí)戰(zhàn),匹配中文
import re
def test_zh():
data1 ='我愛(ài)111北京%天安
審核編輯:劉清
-
字符串
+關(guān)注
關(guān)注
1文章
585瀏覽量
20573 -
python
+關(guān)注
關(guān)注
56文章
4806瀏覽量
84934 -
ASSERT
+關(guān)注
關(guān)注
0文章
17瀏覽量
7266 -
Split
+關(guān)注
關(guān)注
0文章
6瀏覽量
5580
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論