study1
import re
'''
注意一般匹配都是按行来处理的
普通字符像是字母数字,可以直接匹配
.表示要匹配的除了 换行符 外的任何单个字符
*表示匹配前面的子表达式任意次,包括0次
+表示匹配前面的子表达式一次或多次,与*不同的是它不包括0次
{}表示前面的字符匹配指定的次数 eg{3,6}至少出现3次至多出现6次 {4}出现4次
?可以表示前面的字符匹配0次或1次,以及贪婪和非贪婪模式study2
反斜杠\用途很多见study3
方括号[]可以解决选择性的功能
^不在方括号内表示匹配问本的起始位置,在单行模式表示匹配整个文本的开头,在多行模式表示匹配文本每行的开头位置
$表示问本的结束位置用法与^一样
()组选择study4
re的一些方法:
split方法
re.match 尝试从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功的话,match()就返回none。 :re.match(pattern, string, flags=0)
re.search 扫描整个字符串并返回第一个成功的匹配。re.search(pattern, string, flags=0)
区别:re.match只匹配字符串的开始,如果字符串开始不符合正则表达式,则匹配失败,函数返回None;而re.search匹配整个字符串,直到找到一个匹配。
re.sub用于替换字符串中的匹配项。re.sub(pattern, repl, string, count=0, flags=0)
pattern : 正则中的模式字符串。
repl : 替换的字符串,也可为一个函数。
string : 要被查找替换的原始字符串。
count : 模式匹配后替换的最大次数,默认 0 表示替换所有的匹配。
re.findall 在字符串中找到正则表达式所匹配的所有子串,并返回一个列表,如果没有找到匹配的,则返回空列表。
findall(string[, pos[, endpos]])
match 和 search 是匹配一次 findall 匹配所有。
'''
# .的使用
str = "苹果是绿色的,红色,绿+,绿油油油油"
form = re.compile(r'.色')
print(type(form)) #这个对象里面有很多处理字符串的方法
for one in form.findall(str):
print(one) #打印出绿色 红色
#*的使用
#紧跟在.后表示任意字符出现任意次,eg .,*意思就是,后面的所有(包括逗号)
form2 = re.compile(r',.*')
for one in form2.findall(str):
print(one) #打印出绿色 红色
# 紧跟在字符后表示前面字符出现任意次,eg .,*意思就是,后面的所有(包括逗号)
#+的使用
print("+")
form2 = re.compile(r'绿色+')
for one in form2.findall(str):
print(one) #打印出绿色 后面的绿没有打印出
#{}的使用
print("{}")
form2 = re.compile(r'绿油{3,6}')
for one in form2.findall(str):
print(one)
#[]的使用
print('[]')
str = "13500001111, 13900002222"
form2 = re.compile(r'1[35]\d{9}') #表示3或5,而非35
for one in form2.findall(str):
print(one)#两个都输出
print()
form3 = re.compile(r'13[5]\d*')
for one in form3.findall(str):
print(one)#只输出了一个
#也可以写范围[3-7]这样,也可以匹配字符如[A-F]
#一些元字符在方括号失去作用了,eg .只表示.不表示任意字符了 如a[.]
#方括号中^表示非
#^的使用
#这里要学会'''的用法
str = '''001-苹果-60
002-橙子-70'''
print("^")
form2 = re.compile(r'\d+')
for one in form2.findall(str):
print(one) #想选序号结果全部都出了
print()
form3 = re.compile(r'^\d+',re.M) #设置为多行模式
for one in form3.findall(str):
print(one)#编号
print()
form4 = re.compile(r'\d+$',re.M) #设置为多行模式
for one in form4.findall(str):
print(one)#价格
#split使用正则
str = '你好世界;你好世界 你好世界, 你好世界'
list = re.split(r'[;,\s]\s*',str)
print(list) #['你好世界', '你好世界', '你好世界', '你好世界']
study2
import re
#贪婪模式和非贪婪模式(在*和+第一定要注意,尽可能多还是尽可能少地匹配)
#想把所有的html标签提取出来
str = '<html><head><title>Title</title>'
#想得到一个列表
form = re.compile(r'<.*>')
result = form.findall(str)
print(result) #得到['<html><head><title>Title</title>'] 这个情况显然不是想要的,这种情况叫贪婪模式也就是尽可能多地匹配
#非贪婪模式是在后面加?
form = re.compile(r'<.*?>')
result = form.findall(str)
print(result) #输出['<html>', '<head>', '<title>', '</title>']
study3
import re
#\的使用 \的用途有很多
#1.转义
#匹配. * 等这些特殊字符
str = "苹果.是绿色的"
form = re.compile(r'.*\.') #匹配.前面的所有字符
result = form.findall(str)
print(result)
#2.匹配某种类型的一个字符
'''
\d匹配0-9之间任意一个数字字符等价于[0-9]
\D匹配任意一个不是0-9的数字字符,等价于[^0-9]
\s匹配任意一个空白字符,包括空格、tab、换行符等,等价于[\t\n\r\f\v]
\S匹配任意要给非空白字符
\w匹配任意一个文字字符,包括大小写字母、数字、下划线,等价于表达式[a-zA-Z0-9] (经常用在判断用户登录输入)
\w也包含Unicode的字符比如中文,如果指定ASCII码那么只能匹配ASCII(re.A)
compile(,re.A) A是 ASCII码模式
M是多行模式
I是大小写敏感模式
\W匹配任意一个非文字字符
'''
study4
import re
#()组选择
str = '''苹果,苹果红色
橘子,橘子橙色'''
form = re.compile(r'.*,',re.M) #想选水果名
for one in form.findall(str):
print(one) #但包含逗号
form2 = re.compile(r'(.*),',re.M) #想选水果名
for one in form2.findall(str):
print(one) #现在不包含逗号了
#上面是选择一组,接下来获取多组内容,可以用去对爬取内容的处理,如生成名字手机号对应信息等
print()
form2 = re.compile(r'^(.*)(,)',re.M) #想选水果名
for one in form2.findall(str):
print(one) #出来的是元组