正则表达式

一、优缺点

正则的优点:速度快,效率高,准确性高
正则的缺点:新手上手难度有点儿高.

二、常用字符

.        匹配除换行符以外的任意字符
\w       匹配字母或数字或下划线
\s       匹配任意的空白符
\d       匹配数字
\n       匹配一个换行符
\t       匹配一个制表符

^        匹配字符串的开始
$        匹配字符串的结尾

\W       匹配非字母或数字或下划线
\D       匹配非数字
\S       匹配非空白符

a|b      匹配字符a或字符b

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

[...]    匹配字符组中的字符

[^...]   匹配除了字符组中字符的所有字符


三、量词

*        重复零次或更多次
十       重复一次或更多次
?       重复零次或一次
{n}      重复n次
{n,}     重复n次或更多次
{n,m}    重复n到m次

四、贪婪匹配和惰性匹配

.*        贪婪匹配
.*?      惰性匹配

五、re模块

1、findall

import re

# findall:匹配字符串中所有的符合正则的内容
lst = re.findall(r"\d+","我的电话号码是:10086,我女朋友的电话号码是10080")

print(lst)

2、finditer

import re

# finditer:匹配字符串中所有的内容[返回的是迭代器(match)],从迭代器中拿到内容需要,group()
lst = re.finditer(r"\d+","我的电话号码是:10086,我女朋友的电话号码是10080")

for i in lst:

	print(i.group())

3、search

import re

# search,找到一个结果就返回,返回的结果是match对象,拿数据需要.group()
lst = re.search(r"\d+","我的电话号码是:10086,我女朋友的电话号码是10080")

print(lst.group())

4、match

import re

# match是从头开始匹配,如果没匹配到就报错
lst = re.match(r"\d+","10086,我女朋友的电话号码是10080")

print(lst.group())

5、预加载正则表达式

import re

obj = re.compile(r"\d+")

ret = obj.finditer("我的电话号码是:10086,我女朋友的电话号码是10080")

for i in ret:

	print(i.group())

六、正则匹配

import re

s = """
<div class='aa'><span id='1'>赵</span></div>
<div class='bb'><span id='2'>钱</span></div>
<div class='cc'><span id='3'>孙</span></div>
<div class='dd'><span id='4'>李</span></div>

"""


obj = re.compile(r"<div class='.*?'><span id='.*?'>.*?</span></div>",re.S)  # re.S 能让.能匹配换行符(原本.是不能匹配换行符的)

ret = obj.finditer(s)

for i in ret:

	print(i.group())


import re

s = """
<div class='aa'><span id='1'>赵</span></div>
<div class='bb'><span id='2'>钱</span></div>
<div class='cc'><span id='3'>孙</span></div>
<div class='dd'><span id='4'>李</span></div>

"""

# 在需要匹配的地方取个别名,如wahaha,(?P<wahaha>.*?)
obj = re.compile(r"<div class='.*?'><span id='.*?'>(?P<wahaha>.*?)</span></div>",re.S)

ret = obj.finditer(s)

for i in ret:
	print(i.group("wahaha"))

posted @ 2021-11-02 15:21  lnterpreter  阅读(143)  评论(0编辑  收藏  举报