正则表达式:就是为了能够模糊匹配。str的find方法都是精准匹配。

1.普通字符——就是精准匹配

import re
print(re.findall('alex','ablalex')) #打印['alex']

2元字符

. ^ $ * ? {} [] | () \

a . 匹配任意字符,除了换行符

import re
print(re.findall('a..x','ablxalex')) #['ablx', 'alex']

b ^ 从头匹配 $ 从尾匹配

import re
print(re.findall('^a..x','ablxalex')) #^从头对应的几个字符匹配['ablx']
print(re.findall('a..x$','ablxalex')) #从尾对应的几个字符匹配['alex']

c * + ? {}

import re

print(re.findall('alex*', 'alebbalex'))  # *前一个字符为【0,无穷】个。输出['ale', 'alex']
print(re.findall('alex+', 'alebbalex'))  # +前一个字符为【1,无穷】个。输出['ale', 'alex']
print(re.findall('alex?', 'alebbalexxxxxx'))  # ?前一个字符为【0,1】个。输出['ale', 'alex']
print(re.findall('alex{4}', 'alebbalexxxxxx'))  # {0,}同*,{1,}同+,{0,1}同?,可输入任意区间或具体个数 ['alexxxx']
print(re.findall('alex{1,9}', 'alebbalexxxxxx'))  # ['alexxxxxx']
'''* + ? {}都是贪婪模式,后面按最多的取.若后面加?就是惰性匹配,按最少的来'''
print(re.findall('alex??', 'alebbalexxxxxx'))
print(re.findall('alex{1,9}?', 'alebbalexxxxxx'))

d [] 字符集:用来表示一组字符,或的意思

字符集里边有功能的符合3个:- (到) ^(非) \(转义字符)。其它的符合都没有含义

import re

print(re.findall('a[abc]', 'ablebbaclex'))  # []内只能选一个元素组合。如aa,ab,ac 。打印结果['ab', 'ac']
print(re.findall('a[a*.bc]', 'a.blebba*clex'))  # ['a.', 'a*']
print(re.findall('a[0-9]', 'a21a*9'))  # ['a2']
print(re.findall('a[a-z]', 'a21ab9'))  # ['ab'] -按asci排序
print(re.findall('a[a-z]*', 'a21abz'))  # ['a', 'abz']   *前面是【】,所以【】是0-无穷相当于a【】【】【】【】【】【】
print(re.findall('q[^a-z]', 'q213qa'))  # ['q2']

e  \ 让元字符变成没特殊意义,让没有特殊意义的字符变得有意义。如\(

 

d

匹配一个数字字符。等价于 [0-9]。

\D

匹配一个非数字字符。等价于 [^0-9]。

\s

匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v]。

\S

匹配任何非空白字符。等价于 [^ \f\n\r\t\v]。

\w

匹配包括下划线的任何单词字符。等价于'[A-Za-z0-9_]'。

\W

匹配任何非单词字符。等价于 '[^A-Za-z0-9_]'。

  

 

 

 

 

 

 

  \b       匹配一个特殊字符边界。比如空格,&,#等

[\]里边的'\'和单独的'\'意义完全意义

print(re.findall('[\d]',"aa1bb2"))
print(re.findall('\d',"aa1bb2"))

python元素符号 python中的元字符_python

import re


a=re.findall('I\b',"I am lix")
print(a)
'''\b在re确实有特殊功能,但是python解释器\b代表退格,所以python先把\b处理了
有两种解决方案。1,字符串前面加r,意思是raw string 原始字符串,不用转义
2,多加\,\\代表在python中就是\.
'''
print(re.findall(r'I\b',"I am lix"))
print(re.findall('I\\b',"I am lix"))

python元素符号 python中的元字符_python元素符号_02

如果像\l本身在re中也有特殊含义,就要\\\
import re
print(re.findall('c\\\n',"abc\ner"))
print(re.findall(r'c\n',"abc\ner")) #最好用r

python元素符号 python中的元字符_python元素符号_03

f | 或
import re
print(re.findall('bc|n',"bcbnr"))

python元素符号 python中的元字符_python元素符号_04

.

g ()分组
import re
print(re.findall('www\.(baidu)\.com','www.baidu.co')) #未匹配成功
print(re.findall('www\.(baidu)\.com','www.baidu.com'))#匹配成功,但()优先级高,只显示括号内容
print(re.findall('www\.(?:baidu)\.com','www.baidu.com')) #?:去优先级

python元素符号 python中的元字符_bc_05

 

 使用search方法分组

import re

a = re.search('(?P<name>\D+)', 'ab12cd')
print(a)  # <_sre.SRE_Match object; span=(2, 4), match='12'>
print(a.group('name'))  # 与分组名对应的str
print(a.group(0))  # 索引

b = re.search('(?P<name>\D+)(?P<age>\d+)', 'ab12cd')
print(b)  # <_sre.SRE_Match object; span=(2, 4), match='12'>
print(b.group('age'))  # 与分组名对应的str
print(b.group(0))  # 索引.有些绕,最好不要用

python元素符号 python中的元字符_python_06

 

 

test:寻找计算式最内层括号里的元素
12+(34*6+2-5*(2-1))
import re


print(re.findall('\([^()]+\)',"12+(34*6+2-5*(2-1))")) 
'''\( \)把()变成无特殊含义,里边不是括号,所以^(),至少一个非,所以是+'''

python元素符号 python中的元字符_bc_07