0x00:常见的正则表达式的属性

函数 / 方法 描述
仅仅是 re 模块函数
complie ( pattern , flags =0) 使用任何可选的标记来编译正则表达式的模式,然后返回一个正则表达式对象
re 模块函数和正则表达式对象的方法
match(pattern , string , flags =0 ) 尝试 使用带有 可选标记的正则表达式的模式来匹配字符串,如果匹配成功,就返回匹配对象,如果失败,就返回None
search(pattern , string , flags =0 ) 尝试 使用可选标记搜索字符串中第一次出现的 正则 表达式,如果匹配成功,就返回匹配对象,如果失败,就返回None
findall(pattern , string [,flags] ) 查找字符串中所有(非重复)出现的正则表达式模式,并返回一个列表
finditer(pattern , string [,flags] ) 与 dindall 相同,但返回不是一个列表,而是一个迭代器。对于每一次匹配,迭代器返回一个对象
split(pattern ,string,max =0) 根据正则表达式的模式分隔符,split 函数将字符串分隔 为列表,然后返回成功匹配的列表,分隔最多操作max 次(默认分隔 所有匹配的模式)
sub(pattern , repl , string ,count=0) 使用repl 替换所有的正则表达式在字符串中出现 的位置,除非定义 count,否则就将替换所有出现的位置
group(num=0) 返回整个匹配对象,或者编号为num 的特定子组
groups (deault = None) 返回一个包含所有匹配子组的元组(如果没有匹配,则返回一个空元组)
groupdict (deault = None) 返回一个包含 所有匹配的命名子组的字典,所有 的子组名称作为字典的键(如果没有成功匹配,则返回一个空字典)
常用的模块属性(用于大多数正则表达式函数的标记)
re.I 、re.IGNORECASE 不区分大小写的匹配
re.L 、 re.LOCALE 根据所使用的本地语言环境通过 \w、 \W 、\b、\s、\S实现匹配
re.M 、re.MULTILINE ^ 和 $ 分别匹配字符串中行的 起始和结尾,而不是严格的匹配整个字符串本身的起始和结尾
re.S 、re.DOTALL . 号通常匹配除了 \n 之外的所有单个字符;该标记表示 点号能够匹配全部字符
re.X 、re.VERBOSE 通过反斜线转义,而否则所有空格加上 #(以及在改行后所有后续文字)都被忽略,除非在一个 字符类中或者允许注释

0x01:匹配对象以及 group() 和 groups() 方法

当处理正则表达式时,除了正则表达式对象之外,还有另外一个对象类型: 匹配对象。 这些是成功调用 match() 或者 search()返回的对象。

匹配对象有两个方法:group() 和 groups()。 group()要么返回整个匹配对象,要么根据要求返回特定的子组。 groups() 则返回一个包含唯一或者全部子组的元组。没有子组的要求,当groups()任然返回整个匹配时,groups()将返回一个空元组。

0x02:使用match()方法匹配字符串

match()函数从字符串的起始部分对模式进行匹配,如果匹配成功,就返回一个对象;如果匹配失败,就返回None,匹配对象的 group()方法能够用于显示那个成功的匹配。

  1. import re
  2. m = re.match('foo','foo') 模式匹配字符串
  3. if m is not None: 如果模式匹配成功,就输出匹配的内容
  4. print(m.group())

0x03: 使用search() 在一个字符串中查找模式(搜索和匹配的对比)

search()的工作方式和match()的工作方式一致,不同的地方在于 search()会用它的字符串参数,在任意位置对给定的正则表达式搜索第一次出现的匹配情况,如果搜索到成功的匹配,就会返回一个对象; 否则,返回None。

  1. import re
  2. print('match 匹配的方式')
  3. m = re.match('foo', 'seafood')
  4. if m is not None: 匹配失败
  5. print(m.group())
  6. print('-----------------------')
  7. print('search 匹配的方式')
  8. a = re.search('foo','seafood')
  9. if a is not None:
  10. print(a.group())

0x04:匹配多个字符串

  1. import re
  2. bt = 'bat|bet|bit'
  3. m = re.match(bt,'bat')
  4. if m is not None:
  5. print(m.group())
  6. print('------------------')
  7. print('match匹配失败')
  8. a = re.match(bt,'bLt')
  9. if a is not None:
  10. print(a.group())
  11. print('------------------')
  12. print('match匹配失败,不能匹配字符串')
  13. b = re.match(bt,'He it me!')
  14. if b is not None:
  15. print(b.group())
  16. print('------------------')
  17. c = re.search(bt,'He bit me!')
  18. if c is not None:
  19. print(c.group())

0x05: 匹配单个字符

import re
patt314 = '3.14'                         #表示正则表达式的点号
pi_patt = '3\.14'                        #表示字面上的点号
m = re.match(pi_patt,'3.14')      #精准匹配
if m is not None:
    print(m.group())

a  = re.match(patt314,'3014')           #点号匹配0
if a is not None:
    print(a.group())


b  = re.match(patt314,'3.14')                            #点号匹配.
if b is not None:
    print(b.group())

0x06:创建字符集 ( [])

import  re

m = re.match('[cr][23][dp][o2]','c2do')
if m is not None:
    print(m.group())


print('-----------------')
print('则一正则表达式匹配')

b = re.match('r2d2|c3po','c2do')    #不匹配 c2do
if b is not None:
    print(b.group())
print('匹配失败')


a = re.match('r2d2|c3po','r2d2')    #不匹配 c2do
if a is not None:
    print(a.group())

0x07:重复、特殊字符和分组

正则匹配重复模式

import re

patt = '\w+@(\w+\.)*\w+\.com'  

print(re.match(patt, 'noody@www.xxx.yyy.com').group())



特殊字符和分组
import re

m = re.match('(\w\w\w)-(\d\d\d)','aaa-222')

print(m.group())

print('子组1----')
print(m.group(1))

print('子组2----')
print(m.group(2))

print('全部子组----')
print(m.groups())


输出效果
aaa-222
子组1----
aaa
子组2----
222
全部子组----
('aaa', '222')

展示不同的分组排列

import re

m = re.match('(a(b))','ab')
print(m.group())

print(m.group(1))

print(m.group(2))

print(m.groups())

输出结果:  第一个括号开始为分组1 ,第二个括号为分组二
ab
ab
b
('ab', 'b')

0x08:匹配字符串的起始和结尾以及单词边界

import re
m = re.search('^The','The end')
if m is not None: print(m.group())
... 
The



使用 \b 匹配边界的情况
import re

m = re.search(r'\bthe', 'bite the dog')     在边界

if m is not None:
    print(m.group())
else:
    print('匹配失败')

输出结果
E:\Python3\python3.exe E:/pythonProject/正则表达式.py
the



有边界的情况
m = re.search(r'\bthe', 'bite the dog') # 有边界
if m is not None:
      print(m.group())
else:
      print(m)
#输出
None


m = re.search(r'\Bthe', 'bite the dog') # 没有边界
if m is not None:
      print(m.group())
else:
      print(m)
#输出
'the'

1.特殊字符\b和\B可以用来匹配字符边界。\b用于匹配一个单词的边界,这意味着,如果一个模式必须位于单词的起始部分,就不管该单词前面(单词位于字符串中间)是否有任何字符(单词位于行首)。

2.\B将匹配出现在一个单词中间的模式(即,不是单词边界)。

0x09: 使用findall()和finditer()查找每一次出现的位置

findall() 查询字符串中某个正则表达式模式全部的非重复情况,这与 search() 在执行字符串搜索时类似。findall()总是返回一个列表。如果findall() 没有找到匹配部分,就返回一个空列表,匹配成功,列表将包含所有成功的匹配部分。

import re

s = "This and that"

m = re.findall(r'(Th\w+) and (th\w+)' , s)
print(m)

finditer()函数在匹配对象中迭代,匹配成功返回一个元组。

import re

s = "This and that"

m = re.finditer(r'(Th\w+)' , s,re.I)


a = m.__next__()
print(a.groups())

print(a.group(1))

a = m.__next__()
print(a.groups())

# 直接使用 for 去遍历子组(finditer)
a = [g.group(1)  for g in re.finditer(r'(Th\w+)' , s,re.I)]
print(a)


0x10: 使用 sub() 和 subn() 搜索和替换

sub() 和 subn() 两者几乎一样,都是将某字符串中所有匹配表达式的部分进行某种形式的替换。用来替换的部分通常是一个字符串,也可能是个函数。

subn() 还返回一个表示替换的总数,替换后的字符串和表示替换总数的数字一起作为一个拥有两个元素的元组返回。

下面给出示例:

import re

a = re.sub('X', 'Mr. Smith','attn: X\n\nDear X\n')

print(a)




b = re.subn('X', 'Mr. Smith','attn: X\n\nDear X\n')

print(b)


E:\Python3\python3.exe E:/pythonProject/正则表达式.py
attn: Mr. Smith

Dear Mr. Smith

('attn: Mr. Smith\n\nDear Mr. Smith\n', 2)


a = re.sub('[ae]','X','abcde')
print(a)

E:\Python3\python3.exe E:/pythonProject/正则表达式.py
XbcdX

0x11: 在限定模式上使用 split() 分隔 字符串

split()方法基于正则表达式分隔字符串,可以通过为 max 参数设定一个值(非零)来指定最大分割数。

来一个示例说明:

import re

a = re.split(':','ste1:str2:str3')
print(a)


Date =  (
    'Moutain View,CA 94040 ',
    'Sunnyvale,CA',
    'Los Alots,94023'

)

for danum in Date:
    a = re.split(',|(?= (?:\d{5}|[A-X]{2}))',danum)
    print(a)

 如果空格后面跟5个数字或者两个大写字母,就是用 split语句分隔该字符

 E:\Python3\python3.exe E:/pythonProject/正则表达式.py
['ste1', 'str2', 'str3']
['Moutain View', 'CA', ' 94040 ']
['Sunnyvale', 'CA']
['Los Alots', '94023']

0x12:扩展符号

Python 的正则表达式支持大量的扩展符号,来一起查看具体的示例吧

import re

a = re.findall(r'(?im)(^th[\w ]+)', """    ?im 忽略大小写 和匹配字符串的行首位置
This line  is  the first
anothrt line
that lime ,it's the best
""")

print(a)

re.X/VERBOSE 标记 示例

import re

a = re.search(r'''(?x)
\((\d{3})\)
[ ]
(\d{3})
-
(\d{4})

''','(800) 555-1212').groups()

print(a)


运行结果
E:\Python3\python3.exe E:/pythonProject/正则表达式.py
('800', '555', '1212')

(?…) 表示通过该符号进行正则表达式分组,但是并不会保存该分组用于后续的检索和应用

import re

a = re.search(r'\((?P<aaa>\d{3})\) (?P<ddd>\d{3})-(?:\d{4})', '(800) 555-1212').groupdict()

print(a)


运行结果
E:\Python3\python3.exe E:/pythonProject/正则表达式.py
{'aaa': '800', 'ddd': '555'}


(?=…) 和 (?!…) 在目标字符串中实现一个 前视匹配和 后视匹配,前者是正向前断言,后者是负向前断言

import re

a = re.findall(r'\w+(?= van Rossum)','''
guido van Rossum
time  test
just van Rossum
ales sdasa
''')

print(a)

运行结果
E:\Python3\python3.exe E:/pythonProject/正则表达式.py
['guido', 'just']



负先前断言
import re

a = re.findall(r'(?m)^\s+(?!lala|test)(\w+)','''
 aaa@qq.com
 lala@acbd.com
 bbb@tsgd...com
 test@ttg.com
 admin@ddc.com


''')
print(a)

运行结果
E:\Python3\python3.exe E:/pythonProject/正则表达式.py
['aaa', 'bbb', 'admin']