Python笔记---常用正则表达式练习


正则表达式的作用不言而喻,网上也有很多基础规则的列表。Python的正则表达式处理主要基于Python的re模块,这里主要基于几个常用的元字符做一些基本介绍和代码验证。代码块中省略了import re

1. \d :匹配一个数字字符。等价于 [0-9]。

示例代码块:

a = 'C0dke3rlt443~!0ydwo73d8'
r = re.findall(r'\d', a)
print(f'r : {r}')

输出结果:

r : ['0', '3', '4', '4', '3', '0', '7', '3', '8']

2. \D:匹配一个非数字字符。等价于 [^0-9]。

示例代码块:

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']

3. [ ]

[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']

4. -

[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']

5. { }:

{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']

6. * 、+ 和 ?

*:匹配前面的子表达式零次或多次。
+:匹配前面的子表达式一次或多次。
?:匹配前面的子表达式零次或一次。
示例代码块:

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']

7. ^ 和 $

^:匹配输入字符串的开始位置。
$:匹配输入字符串的结束位置。
示例代码块:

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 : []

8. ()

(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']

9. re.I 和 re.S

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']

10. re.sub():字符替换函数

示例代码块:

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++

11. 方法作为参数:

将方法名作为替换函数的一个参数传给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

12. re.search() 和 re.match()

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']

13. group() 和 groups()

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

总结:

正则表达式记不住,需要练习练习再练习。当然如果不是写爬虫,我倒是觉得需要时候先学一些基本的知识或者直接百度已经有的表达式就够了。

  • 12
    点赞
  • 41
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值