#正则表达式用于匹配一类具有相同规则的字符串,对于网页结构多变的有奇效
#规则:
# 单字符:
# . :除换行以外所有字符
# [] :匹配集合中任意一个字母
# \ :转义
# \d :数字 [0-9]
# \D :非数字
# \w :数字、字母、下划线、中文
# \W :非\w
# \s :所有的空白字符
# \S :非空白
# 数量修饰:
# * :任意多次,可以为0次
# + :至少一次
# ? :0次或1次
# {m} :固定m次
# {m,} :至少m次
# {m,m} :m-n次
# 边界:
# \b \B
# $ :以某某结尾
# ^ :以某某开头
# 分组:
# () :视为一个整体;组模式 \1 \2
# 例:
import re
string = '<p><div><span>猪八戒</span></div></p>'
pattern = re.compile(r'<(\w+)><(\w+)>\w+</\2></\1>')
ret = pattern.search(string)
#print(ret)
#以上是使<div>与</div>相互匹配
# 贪婪模式:
# .*? .+?,加个问号,就会取消贪婪模式,使匹配的字数变少
# re.I :忽略大小写
# re.M :多行匹配
# re.S :单行匹配,可以匹配换行符
#例:
#string = '''hate is a beautiful feeling
#love you very much
#love she
#love her'''
#string2 = '''<div>沁园春-雪
#北国风光
#千里冰封
#万里雪飘
#望长城内外
#惟余莽莽
#</div></div>'''
#pattern = re.compile(r'^love',re.M)
#pattern = re.compile(r'<(\w+)>(.*?)</\1>',re.S)
#ret = pattern.findall(string2)
#print(ret)
#\w+无法匹配换行符
#有换行符时要re.S来设置单行模式,就可以匹配换行符
#match只从开始位置找,search从任意位置找,findall查找所有字符
#re.sub(正则表达式,替换内容,字符串),用于正则替换,例如:
#string = 'i love you, you love me, ye'
#pattern = re.compile(r'love')
#ret = re.sub(r'love','hate',string)
#ret = pattern.sub('hate',string)
#print(ret)
#我们也可以在替换内容那里用函数来实现
def fn(a):
ret = int(a.group())
#group()表示的是正则匹配的结果
return str(ret - 5)
string = '我喜欢身高为175的女孩'
pattern = re.compile(r'\d+')
ret = pattern.sub(fn, string)
print(ret)
(1)正则表达式一个更行之有效的办法是直接把那部分网页给截出来,然后把自己要的部分变成(.*?)
,去掉其他的一些东东,变成.*?
,然后就可以提取了
(2)注意有换行符时要用单行模式:re.S