1、常用正则表达式符号
-
⒈通配符( . )
-
作用:点(.)可以匹配除换行符以外的任意一个字符串
-
例如:‘.ython’ 可以匹配‘aython’ ‘bython’ 等等,但只能匹配一个字符串
-
-
2转义字符( \ )
-
作用:可以将其他有特殊意义的字符串以原本意思表示
-
例如:‘python.org’ 因为字符串中有一个特殊意义的字符串(.)所以如果想将其按照普通意义就必须使用这样表示: ‘python.org’ 这样就只会匹配‘python.org’ 了
-
注:如果想对反斜线(\)自身转义可以使用双反斜线(\)这样就表示 ’\’
-
-
⒊字符集([])
-
作用:使用中括号来括住字符串来创建字符集,字符集可匹配他包括的任意字串
①‘[pj]ython’ 只能够匹配‘python’ ‘jython’
② ‘[a-z]’ 能够(按字母顺序)匹配a-z任意一个字符
③‘[a-zA-Z0-9]’ 能匹配任意一个大小写字母和数字
④‘[^abc]’ 可以匹配任意除a,b和c 之外的字符串
-
-
⒋管道符(|)
-
作用:一次性匹配多个字符串
-
例如:’python|perl’ 可以匹配字符串‘python’ 和 ‘perl’
-
-
⒌可选项和重复子模式(在子模式后面加上问号?)
- 作用:在子模式后面加上问号,他就变成可选项,出现或者不出现在匹配字符串中都是合法的
例如:r’(aa)?(bb)?ccddee’ 只能匹配下面几种情况
‘aabbccddee’
‘aaccddee’
‘bbccddee’
‘ccddee’
-
⒍字符串的开始和结尾
① ‘w+’ 匹配以w开通的字符串
② ‘^http’ 匹配以’http’ 开头的字符串
③‘ $com’ 匹配以‘com’结尾的字符串
-
7.最常用的匹配方法
\d 匹配任何十进制数;它相当于类 [0-9]。
\D 匹配任何非数字字符;它相当于类 [^0-9]。
\s 匹配任何空白字符;它相当于类 [ fv]。
\S 匹配任何非空白字符;它相当于类 [^ fv]。
\w 匹配任何字母数字字符;它相当于类 [a-zA-Z0-9_]。
\W 匹配任何非字母数字字符;它相当于类 [^a-zA-Z0-9_]。\w* 匹配所有字母字符
\w+ 至少匹配一个字符
1 '.' 默认匹配除\n之外的任意一个字符,若指定flag DOTALL,则匹配任意字符,包括换行
2 '^' 匹配字符开头,若指定flags MULTILINE,这种也可以匹配上(r"^a","\nabc\neee",flags=re.MULTILINE)
3 '$' 匹配字符结尾,或e.search("foo$","bfoo\nsdfsf",flags=re.MULTILINE).group()也可以
4 '*' 匹配*号前的字符0次或多次,re.findall("ab*","cabb3abcbbac") 结果为['abb', 'ab', 'a']
5 '+' 匹配前一个字符1次或多次,re.findall("ab+","ab+cd+abb+bba") 结果['ab', 'abb']
6 '?' 匹配前一个字符1次或0次
7 '{m}' 匹配前一个字符m次
8 '{n,m}' 匹配前一个字符n到m次,re.findall("ab{1,3}","abb abc abbcbbb") 结果'abb', 'ab', 'abb']
9 '|' 匹配|左或|右的字符,re.search("abc|ABC","ABCBabcCD").group() 结果'ABC'
10 '(...)' 分组匹配,re.search("(abc){2}a(123|456)c", "abcabca456c").group() 结果 abcabca456c
11
12 '\A' 只从字符开头匹配,re.search("\Aabc","alexabc") 是匹配不到的
13 '\Z' 匹配字符结尾,同$
14 '\d' 匹配数字0-9
15 '\D' 匹配非数字
16 '\w' 匹配[A-Za-z0-9]
17 '\W' 匹配非[A-Za-z0-9]
18 's' 匹配空白字符、\t、\n、\r , re.search("\s+","ab\tc1\n3").group() 结果 '\t'
19 \b 匹配一个单词边界,也就是指单词和空格间的位置,如,“er\b”可以匹配“never”中的“er”,但不能匹配“verb”中的“er”
20 \B 匹配非单词边界。“er\B”能匹配“verb”中的“er”,但不能匹配“never”中的“er”
2、re模块常用函数
-
⒈ re.compile(pattern[, flags])
1)把一个正则表达式pattern编译成正则对象,以便可以用正则对象的match和search方法
2)用了re.compile以后,正则对象会得到保留,这样在需要多次运用这个正则对象的时候,效率会有较大的提升
import re
mobile_re = re.compile(r'^(13[0-9]|15[012356789]|17[678]|18[0-9]|14[57])[0-9]{8}$')
ret = re.match(mobile_re,'18538762511')
print(ret) # <_sre.SRE_Match object; span=(0, 11), match='18538652511'>
-
⒉ search(pattern, string[, flags]) 和 match(pattern, string[, flags])
1)match :只从字符串的开始与正则表达式匹配,匹配成功返回matchobject,否则返回none;
2)search :将字符串的所有字串尝试与正则表达式匹配,如果所有的字串都没有匹配成功,返回none,否则返回matchobject;
import re
a =re.match('www.bai', 'www.baidu.com')
b = re.match('bai', 'www.baidu.com')
print(a.group()) # www.bai
print(b) # None
# 无论有多少个匹配的只会匹配一个
c = re.search('bai', 'www.baidubaidu.com')
print(c) # <_sre.SRE_Match object; span=(4, 7), match='bai'>
print(c.group()) # bai
-
⒊ split(pattern, string[, maxsplit=0])
作用:将字符串以指定分割方式,格式化成列表
import re
text = 'aa 1bb###2cc3ddd'
print(re.split('\W+', text)) # ['aa', '1bb', '2cc3ddd']
print(re.split('\W', text)) # ['aa', '1bb', '', '', '2cc3ddd']
print(re.split('\d', text)) # ['aa ', 'bb###', 'cc', 'ddd']
print(re.split('#', text)) # ['aa 1bb', '', '', '2cc3dd]
print(re.split('#+', text)) # ['aa 1bb', '2cc3ddd']
-
⒋ findall(pattern, string)
作用:正则表达式 re.findall 方法能够以列表的形式返回能匹配的子串
import re
p = re.compile(r'\d+')
print(p.findall('one1two2three3four4')) # ['1', '2', '3', '4']
print(re.findall('o','one1two2three3four4')) # ['o', 'o', 'o']
print(re.findall('\w+', 'he.llo, wo#rld!')) # ['he', 'llo', 'wo', 'rld']
-
⒌ sub(pat, repl, string[, count=0])
1)替换,将string里匹配pattern的部分,用repl替换掉,最多替换count次然后返回替换后的字符串
2)如果string里没有可以匹配pattern的串,将被原封不动地返回
3)repl可以是一个字符串,也可以是一个函数
4) 如果repl是个字符串,则其中的反斜杆会被处理过,比如 \n 会被转成换行符,反斜杆加数字会被替换成相应的组,比如 \6 表示pattern匹配到的第6个组的内容
import re
test="Hi, nice to meet you where are you from?"
print(re.sub(r'\s','-',test)) # Hi,-nice-to-meet-you-where-are-you-from?
print(re.sub(r'\s','-',test,5)) # Hi,-nice-to-meet-you-where are you from?
print(re.sub('o','**',test)) # Hi, nice t** meet y**u where are y**u fr**m?
-
⒍ escape(string)
1) re.escape(pattern) 可以对字符串中所有可能被解释为正则运算符的字符进行转义的应用函数。2) 如果字符串很长且包含很多特殊技字符,而你又不想输入一大堆反斜杠,或者字符串来自于用户(比如通过raw_input函数获取输入的内容), 且要用作正则表达式的一部分的时候,可以用这个函数
import re
print(re.escape('www.python.org'))
3、re模块中的匹配对象和组 group()
1)group方法返回模式中与给定组匹配的字符串,如果没有给定匹配组号,默认为组0
2)m.group() == m.group(0) == 所有匹配的字符
group(0)和group(1)的区别
import re
a = "123abc321efg456"
print(re.search("([0-9]*)([a-z]*)([0-9]*)",a).group(0)) # 123abc321
print(re.search("([0-9]*)([a-z]*)([0-9]*)",a).groups()) # ('123', 'abc', '321')
print(re.search("([0-9]*)([a-z]*)([0-9]*)",a).group(1)) # 123
print(re.search("([0-9]*)([a-z]*)([0-9]*)",a).group(2)) # abc
print(re.search("([0-9]*)([a-z]*)([0-9]*)",a).group(3)) # 321
import re
m = re.match('(..).*(..)(..)','123456789')
print(m.group(0)) # 123456789
print(m.group(1)) # 12
print(m.group(2)) # 67
print(m.group(3)) # 89`在这里插入代码片`
group()匹配之后返回匹配索引
import re
m = re.match('www\.(.*)\..*','www.baidu.com')
print(m.group(1)) # baidu
print(m.start(1)) # 4
print(m.end(1)) # 9
print(m.span(1)) # (4, 9)
group()匹配ip,状态以元祖形式返回
import re
test = 'dsfdf 22 g2323 GigabitEthernet0/3 10.1.8.1 YES NVRAM up eee'
# print(re.match('(\w.*\d)\s+(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})\s+YES\s+NVRAM\s+(\w+)\s+(\w+)\s*', test).groups())
ret = re.search( r'(\w*\/\d+).*\s(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}).*(\s+up\s+)',test ).groups()
print(ret) # 运行结果: ('GigabitEthernet0/3', '10.1.8.1', ' up ')
#1. (\w*\d+\/\d+) 匹配结果为:GigabitEthernet0/3
#1.1 \w*: 匹配所有字母数字
#1.2 /\d+:匹配所有斜杠开头后根数字 (比如:/3 )
#2. (\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}) 匹配结果为:10.1.8.1
#3. \s+up\s+ 匹配结果为: up 这个单词,前后都为空格
4、re模块其他知识点
re匹配忽略大小,匹配换行
import re
#匹配时忽略大小写
print(re.search("[a-z]+","abcdA").group()) #abcd
print(re.search("[a-z]+","abcdA",flags=re.I).group()) #abcdA
#连同换行符一起匹配:
#'.'默认匹配除\n之外的任意一个字符,若指定flag DOTALL,则匹配任意字符,包括换行
print(re.search(r".+","\naaa\nbbb\nccc").group()) #aaa
print(re.search(r".+","\naaa\nbbb\nccc",flags=re.S))
#<_sre.SRE_Match object; span=(0, 12), match='\naaa\nbbb\nccc'>
print(re.search(r".+","\naaa\nbbb\nccc",flags=re.S).group())
aaa
bbb
ccc
计算机用到的知识点
1)init_l=[i for i in re.split('(\-\d+\.*\d*)',expression) if i]
a. 按照类似负数的字符串分割成列表
b. \-\d+\.*\d*是为了可以匹配浮点数(比如:3.14)
c. (if i)是为了去除列表中的空元素
d. 分割结果:['-1', '-2', '*((', '-60', '+30+(',
2)re.search('[\+\-\*\/\(]$',expression_l[-1])
a. 匹配expression_l列表最后一个元素是 +,-,*,/,( 这五个符号就是负数
3)new_l=[i for i in re.split('([\+\-\*\/\(\)])',exp) if i]
a. 将字符串按照+,-,*,/,(,)切分成列表(不是正真的负数就切分)
4)print(re.split('([\+\-])','-1+2-3*(2*2+3)')) #按照加号或者减号分割成列表
运行结果: ['', '-', '1', '+', '2', '-', '3*(2*2', '+', '3)']