python基础|模块---re模块

时间:2022-05-11 03:52:41

  python中的re模块是正则技术中应用。对于正则就是正则表达式,正则表达式是独立一门技术,在各个编程体系都有它的“身影"。在python中在爬虫技术中,数据分析,它都是必不可少的存在。主要利用正则表达式筛选字符串中我们需要的字符串类型数据。

  正则表达式基础知识。元字符和量词。

元字符

匹配作用

.

可以匹配除换行符以外的任何字符

\w

匹配字母,数字和下滑线

\d

匹配数字

\s

匹配空格

\W

匹配非字母,数字和下划线

\D

匹配非数字

\S

匹配非空格

^

匹配^字符串开头。用法(^a:匹配a开头的字符串)

$

匹配$字符串结尾。用法(a$:匹配字符串a结尾)

\n

匹配换行符

\t

匹配一个制表符

\b

匹配单词的结尾

()

匹配括号内的表达式,也表示一个分组

[…]

匹配字符组中的字符

[^….]

匹配除了字符组中的所有字符

a|b

匹配a或b字符

  量词

 量词

用法说明

*

代表零次或多次

+

重复零次或多次

重复零次或一次

{n}

重复n次

{n,}

至少重复n次

{n, m}

重复n次到m次

   以上便是一些基本知识。对于基本知识的应用。进入这个网站:http://tool.chinaz.com/regex/。可以测试这些符号的使用。

python基础|模块---re模块python基础|模块---re模块python基础|模块---re模块python基础|模块---re模块python基础|模块---re模块

  正则表达式在使用量词*和+,正则匹配是贪婪匹配。默认的是尽可能多的匹配。这个时候需要.*?这个正则表达式:这个正则表达式.任意字符。在前也可以自己添加字符,*量词多次匹配。?匹配一次或多次。在后面添加结束的字符。对于贪婪匹配,有惰性匹配。*?重复次任意,但尽可能少重复。+?重复次一次或多次,但尽可能少的匹配。??重复0次到一次,但尽可能少的匹配。此外在匹配时还需要注意转义符\的使用。不想是但\转义可以用\\转义,双\\则需要\\对其转义。或者使用r'\\'转义

python基础|模块---re模块

  在python中re模块的使用。使用调用模块:import re调用。常用的re模块中的函数有findall(), serch(), match()。

  findall('正则表达式', '匹配对象(字符串类型)')。找到正则表达式中的内容,并且返回一个列表,列表中的元素就匹配的结果。

# findall
res = re.findall('a', 'dghahfhjfadhbvavlfhjvb')
print(res)
>>>['a', 'a', 'a']

  search('正则表达式', '匹配对象(字符串类型)')。找到正则表达式中的内容之找一次,找到后就结束。查找到不存在结果返回None。并且返回结果需要借助group函数打印。

res = re.search('a','dasda' )
print(res.group())

  match('正则表达式', '匹配对象(字符串类型)')。只会以正则表达式匹配开头字符串,开头字符长不符合返回None。打印时也需要借助group函数。

python基础|模块---re模块python基础|模块---re模块
ret = re.split('[ab]', 'abcd')  # 先按'a'分割得到''和'bcd',在对''和'bcd'分别按'b'分割
print(ret)  # ['', '', 'cd']

ret = re.sub('\d', 'H', 'eva3egon4yuan4', 1)#将数字替换成'H',参数1表示只替换1个
print(ret) #evaHegon4yuan4

ret = re.subn('\d', 'H', 'eva3egon4yuan4')#将数字替换成'H',返回元组(替换的结果,替换了多少次)
print(ret)

obj = re.compile('\d{3}')  #将正则表达式编译成为一个 正则表达式对象,规则要匹配的是3个数字
ret = obj.search('abc123eeee') #正则表达式对象调用search,参数为待匹配的字符串
print(ret.group())  #结果 : 123

import re
ret = re.finditer('\d', 'ds3sy4784a')   #finditer返回一个存放匹配结果的迭代器
print(ret)  # <callable_iterator object at 0x10195f940>
print(next(ret).group())  #查看第一个结果
print(next(ret).group())  #查看第二个结果
其他内置方法

  使用search和match时可以给正则表达式中的组取名,在调用时使用字符串类型组名和group函数即可调用

res = re.search('(?P<rec>[a-d]*)', 'adaabuxdabcdabcddadadkamfaslcjhlancabcd' )
print(res.group('rec'))
# 必须在组内,以?P<名字>格式
>>>adaab

  在findall的分组机制有些不同

res = re.findall('www.(baidu|jd).com', 'www.baidu.com')
print(res)
>>>['baidu']
# 在组内加上?:
res = re.findall('www.(?:baidu|jd).com', 'www.baidu.com')
print(res)
>>>['www.baidu.com']