1.正则表达式
1.0 检测某段字符串是否符合规则
1.1 从一大段文字中将符合匹配规则的匹配出来
元字符 和 量词
字符串[]描述的是一个字符位置上的内容规则;字符组内都是根据ascii编码来的
[0123456]
[0-5]
[0-9] \d 匹配任意一个数字
[A-Z0-9a-z] \w 标识符
\n 匹配回车换行
\t 匹配制表符
\s 匹配所有的空白
\b 匹配一个单词的边界
空格匹配空格
反义词
\D 匹配除了数字之外的所有
\W 匹配数字字符下划线之外的所有
\S 除了空白之外的所有
开始符号和结束符号:规定了字符串的长度
^ 开始
$ 结束,末尾
| 或的概念
123|456
分组
www\.(baidu|oldboy)\.com
量词 在量词的范围内尽可能多的匹配
{n} 表示出现n次
{n,} 表示至少出现n次
{n,m} 表示出现n-m次
? 表示匹配1次或者多次
+ 表示匹配1次或多次
* 表示匹配0次或多次
转义:
\ #
r'\\n' -> r'\n'
re模块:根据正则从一段内容中查找结果
1. findall 取出所有结果,返回一个列表
ret = re.findall('\d+','color12345mu98') #取出所有的数字
2. search 只取第一个
ret = re.search('\d+' , 'color34asd24') #如果没有+号,只取一个值,也就是只取匹配到的第一个
if ret: #这里如果取到的是空,使用group方法会报错,所以要加一个判断
print(ret.group()) #这里group是方法,需要有小括号,需要注意
3. match 可以被search取代
re.match('\d+','123abc')
关于替换:
re.subn('\d+','nb','color12aa456')
关于分割:
re.split('\d+','color12aaa34aa44')
提升:
re.compile('\d+') #已经编译了,节省时间,爬虫时候会使用
re.finditer() #迭代取值
re.findall() # findall中写了代码,要匹配出来,变异,解释成机器码
re模块的使用:
模块使用:
import re
ret = re.findall('>\w<',r'<title>这是一段文字</title>')
第一:
import re
ret = re.findall('\w+',r'<title>这是一段无聊的文字</title>') #这里如果写w+那么只能匹配多个文字
ret.strip('<>') #将匹配到的符号去掉
第二:
import re
ret = re.findall('(\w+)',r'<title>这是一段无聊的文字</title>') #出来的是一个集合
print(ret[0])
import re
ret = re.search(r'(\d)(\+)(\d)', r'5+6')
print(ret.group(0))
print(ret.group(1))
print(ret.group(2))
print(ret.group(3))
ret = re.search('<(?P<tag>\w+)>(.*)</(?P=tag)>', r'<h1>wahaha</h2></h1></h3>')
print(ret.group())
"""
小括号里面的运算
"""
import re
lis = '1 - 2 * ( (60-30 +(-40/ 5 ) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2))'
lis = lis.replace(' ', '') #把空格去掉
def coun_s(lis):
ret = re.search(r'(?P<name1>(-)?\d+(\.\d+)?)(?P<name2>(\*|/))(?P<name3>(-)?\d+(\.\d+)?)', lis)
if ret:
if ret.group('name2') == '*':
res = float(ret.group('name1')) * float(ret.group('name3'))
if '-' in ret.group('name1') and '-' in ret.group('name3'):
res = '+'+str(res)
else:
res = float(ret.group('name1')) / float(ret.group('name3'))
newcontent = re.sub(r'(?P<name1>(-)?\d+(\.\d+)?)(?P<name2>(\*|/))(?P<name3>(-)?\d+(\.\d+)?)',str(res), lis, 1)
return coun_s(newcontent)
else:
pass
return lis
def sum_num(li2):
ret = re.search(r'(?P<sub1>\d+((\.)\d+)?)(?P<sub2>(\-|\+))(?P<sub3>(-)?\d+((\.)\d+)?)', li2)
if ret:
if ret.group('sub2') == '+':
sum = float(ret.group('sub1')) + float(ret.group('sub3'))
else:
sum = float(ret.group('sub1')) - float(ret.group('sub3'))
news = re.sub(r'(?P<sub1>\d+((\.)\d+)?)(?P<sub2>(\-|\+))(?P<sub3>(-)?\d+((\.)\d+)?)', str(sum), li2, 1)
return sum_num(news)
else:
pass
return li2
def main(lis):
ret = re.search('\([^()]+\)', lis) #拿到最内层小括号
if ret:
li2 = coun_s(ret.group())
li3 = sum_num(li2).strip('()') #加法
news = re.sub('\([^()]+\)', li3, lis, 1)
return main(news)
else:
end = coun_s(lis)
li3 = sum_num(end)
print(li3)
main(lis)