python基础 - 正则表达式

本文介绍了Python中正则表达式的基础知识,包括检测字符串是否符合特定规则以及如何从大量文本中提取匹配信息。通过使用Python的re模块,你可以轻松进行正则匹配和查找操作。
摘要由CSDN通过智能技术生成

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)

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值