示例代码块:
a = 'C0dke3rlt443~!0ydwo73d8'
r = re.findall(r'\d', a)
print(f'r : {r}')
输出结果:
r : ['0', '3', '4', '4', '3', '0', '7', '3', '8']
示例代码块:
a = 'C0dke3rlt443~!0ydwo73d8'
r = re.findall(r'\D', a)
print(f'r : {r}')
输出结果:
r : ['C', 'd', 'k', 'e', 'r', 'l', 't', '~', '!', 'y', 'd', 'w', 'o', 'd']
[xyz]:字符集合。匹配所包含的任意一个字符。
[^xyz]:负值字符集合。匹配未包含的任意字符。
示例代码块:
b = 'abc, acc, adc, aec, afc, ahc'
r1 = re.findall('a[cf]c',b)
r2 = re.findall('a[^cf]c',b)
print(f'r1 : {r1}')
print(f'r2 : {r2}')
输出结果:
r1 : ['acc', 'afc']
r2 : ['abc', 'adc', 'aec', 'ahc']
[a-z]: 字符范围。匹配指定范围内的任意字符
[^a-z]: 负值字符范围。匹配任何不在指定范围内的任意字符。
示例代码块:
b = 'abc, acc, adc, aec, afc, ahc'
r1 = re.findall('a[c-f]c', b)
r2 = re.findall('a[^c-f]c', b)
print(f'r1 : {r1}')
print(f'r2 : {r2}')
输出结果:
r1 : ['acc', 'adc', 'aec', 'afc']
r2 : ['abc', 'ahc']
{n}:n 是一个非负整数。匹配确定的 n 次。
{n,}:n 是一个非负整数。至少匹配n 次。
{m,n}:m 和 n 均为非负整数,其中n <= m。最少匹配 n 次且最多匹配 m 次。
示例代码块:
c = 'python 1111c00matLab098php'
r1 = re.findall('[A-Za-z]{3,5}', c)
r2 = re.findall('[A-Za-z]{3}', c)
r3 = re.findall('[A-Za-z]{3,}', c)
print(f'r1 : {r1}')
print(f'r2 : {r2}')
print(f'r3 : {r3}')
输出结果:
r1 : ['pytho', 'matLa', 'php']
r2 : ['pyt', 'hon', 'mat', 'Lab', 'php']
r3 : ['python', 'matLab', 'php']
*:匹配前面的子表达式零次或多次。
+:匹配前面的子表达式一次或多次。
?:匹配前面的子表达式零次或一次。
示例代码块:
a = 'pytho0python1pythonnn2'
r = re.findall('python*', a)
print(f'python* : {r}')
r = re.findall('python+', a)
print(f'python+ : {r}')
r = re.findall('python?', a)
print(f'python? : {r}')
r = re.findall('python{0,1}', a)
print('python{0,1} : '+ f'{r}')
r = re.findall('python{0,1}?', a)
print('python{0,1}? : '+ f'{r}')
r = re.findall('python{0,2}', a)
print('python{0,2} : '+ f'{r}')
r = re.findall('python{0,2}?', a)
print('python{0,2}? : '+ f'{r}')
输出结果:
python* : ['pytho', 'python', 'pythonnn']
python+ : ['python', 'pythonnn']
python? : ['pytho', 'python', 'python']
python{0,1} : ['pytho', 'python', 'python']
python{0,1}? : ['pytho', 'pytho', 'pytho']
python{0,2} : ['pytho', 'python', 'pythonn']
python{0,2}? : ['pytho', 'pytho', 'pytho']
^:匹配输入字符串的开始位置。
$:匹配输入字符串的结束位置。
示例代码块:
qq1 = '123456789'
qq2 = '12345678'
qq3 = '1234'
qq4 = '123'
r1 = re.findall(r'^\d{4,8}$', qq1)
r2 = re.findall(r'^\d{4,8}$', qq2)
r3 = re.findall(r'^\d{4,8}$', qq3)
r4 = re.findall(r'^\d{4,8}$', qq4)
print('r1 : '+f'{r1}')
print('r2 : '+f'{r2}')
print('r3 : '+f'{r3}')
print('r4 : '+f'{r4}')
输出结果:
r1 : []
r2 : ['12345678']
r3 : ['1234']
r4 : []
(pattern):匹配 pattern 并获取这一匹配。
示例代码块:
a = 'PythonPythonPythonPython'
r0 = re.findall('PythonPythonPython', a)
r1 = re.findall('(Python){3}', a)
r2 = re.findall('(Python){3}(Py){2}', a)
r3 = re.findall('(Python){3}Py', a)
r4 = re.findall('((Python){3}Py)', a)
r5 = re.findall('(Python)+', a)
print('r0 : ' + f'{r0}')
print('r1 : ' + f'{r1}')
print('r2 : ' + f'{r2}')
print('r3 : ' + f'{r3}')
print('r4 : ' + f'{r4}')
print('r5 : ' + f'{r5}')
输出结果:
r0 : ['PythonPythonPython']
r1 : ['Python']
r2 : []
r3 : ['Python']
r4 : [('PythonPythonPythonPy', 'Python')]
r5 : ['Python']
re.I:不区分大小写
re.S:匹配所有字符
示例代码块:
a = 'Python\nJava'
r1 = re.findall('python.{1}', a, re.I | re.S)
r2 = re.findall('python.+', a, re.I | re.S)
r3 = re.findall('python.', a, re.I | re.S)
r4 = re.findall('python?', a, re.I | re.S)
print(f'r1 : {r1}')
print(f'r2 : {r2}')
print(f'r3 : {r3}')
print(f'r4 : {r4}')
输出结果:
r1 : ['Python\n']
r2 : ['Python\nJava']
r3 : ['Python\n']
r4 : ['Python']
示例代码块:
a = 'PythonC++JavaPHPC++'
b = 'PythonC++JavaPHPC++'
r1 = re.sub(r'C\+\+','C', a, 0)
r2 = re.sub(r'C\+\+','C', a, 1)
r3 = re.sub(r'C\+\+','C', b, 0)
r4 = b.replace('C++', 'C')
print(f'a : {a}')
print(f'r1 : {r1}')
print(f'r2 : {r2}')
print(f'r3 : {r3}')
print(f'r4 : {r4}')
print(f'b : {b}')
输出结果:
a : PythonC++JavaPHPC++
r1 : PythonCJavaPHPC
r2 : PythonCJavaPHPC++
r3 : PythonCJavaPHPC
r4 : PythonCJavaPHPC
b : PythonC++JavaPHPC++
将方法名作为替换函数的一个参数传给re.sub()。这种将方法名作为参数的形式在其他地方也经常遇见。
示例代码块:
def test11():
# test methond as a parameter
a = 'PythonCJava'
r = re.sub('[Pp]ython', forTest11, a)
print(f'r : {r}')
def forTest11(value):
print(value)
return '0'
输出结果:
<re.Match object; span=(0, 6), match='Python'>
r : 0CJava
re.search():会在string内查找匹配,只要找到一个成功的匹配,就返回,若在整个string内都找不到匹配的,则返回None
re.match():只从字符串的开始位置匹配,即使是中间位置有匹配的项,也不算匹配成功,也就是说只有在开始位置匹配成功,才有返回,若不是开始位置匹配成功,则返回None
示例代码块:
a = '8u9h33ko3uup'
r1 = re.search(r'\d', a)
r2 = re.match(r'\d', a)
r3 = re.findall(r'\d+', a)
print(f'r1.span() : {r1.span()}')
print(f'r2.group() : {r2.group()}')
print(f'r3 : {r3}')
输出结果:
r1.span() : (0, 1)
r2.group() : 8
r3 : ['8', '9', '33', '3']
group():要么返回整个匹配对象,要么根据要求返回特定子组;如果group()没有子组要求,返回整个匹配。
groups():以元组的形势返回所有匹配
示例代码块:
a = 'life is short, i love Python, I use python'
r1 = re.search('life(.*)python(.*)python', a, re.I)
r2 = re.findall('life(.*)python(.*)python', a, re.I)
print(f'group(0) : {r1.group(0)}')
print(f'group(1) : {r1.group(1)}')
print(f'group(2) : {r1.group(2)}')
print(f'group : {r1.group()}')
print(f'group(0,1,2) : {r1.group(0,1,2)}')
print(f'groups() : {r1.groups()}')
print(f'r2 : {r2}')
for i in range(len(r2)):
print(f'i : {i}')
for j in range(len(r2[i])):
print(f'{i}{j} : {r2[i][j]}')
输出结果:
group(0) : life is short, i love Python, I use python
group(1) : is short, i love
group(2) : , I use
group : life is short, i love Python, I use python
group(0,1,2) : ('life is short, i love Python, I use python', ' is short, i love ', ', I use ')
groups() : (' is short, i love ', ', I use ')
r2 : [(' is short, i love ', ', I use ')]
i : 0
00 : is short, i love
01 : , I use
正则表达式记不住,需要练习练习再练习。当然如果不是写爬虫,我倒是觉得需要时候先学一些基本的知识或者直接百度已经有的表达式就够了。