python3实现正则表达式平衡组

最近遇到一个需求,要获得一个网页上一个div里所有的内容。理所当然的使用正则表达式,但是python是不支持正则平衡组的。所以只能自己写代码实现了。代码如下:

import re

'''
堆栈方式,循环查找标签名称
'''
def loopTab(tagName,content):
    #需要匹配的标签名称
    tagBegin = "<"+tagName
    tagEnd = "</"+tagName
    tagRegex = r"("+tagBegin+"|"+tagEnd+")"

    #标签名称的数量决定着,匹配的结尾在哪里
    #遇到开头标签,就加一,遇到结尾标签就减一
    #直到减到0的时候就是结束的时候
    tagNum = 0;

    pattern = re.compile(tagRegex,re.M|re.S)
    mather = pattern.search(content)

    #循环匹配开头标签和结尾标签
    while mather:
        group = mather.group()
        if group == tagBegin:
            #开头标签,数量加1
            tagNum = tagNum + 1
        else:
            #结尾标签,数量减1
            tagNum = tagNum - 1

        #标签数量为0,循环结束,范围结尾处的下标。
        if tagNum == 0:
            return mather.span()[1] + 2

        #下一次循环
        mather = pattern.search(content,mather.span()[1])

    #如果标签不匹配,返回0。
    return 0;

'''
平衡组查找
'''
def balenceGroup(regexHead,text):
    #解析标签名称
    tabName =  re.compile(r"<(.+?)\s",re.S).search(regexHead).group(1)
    #使用贪婪模式,尽可能多的找到内容,然后从找到的内容中筛选
    regex = regexHead + ".*</"+tabName+">"
    mather = re.compile(regex,re.M|re.S).search(text)
    if mather:
        divContent = mather.group()
        return divContent[:loopTab(tabName,divContent)]
    return ""


text = '''  <div id="1">
                <div id="2">
                    <div id="3">
                        aaa
                    </div>
                </div>
                <div id="4">
                    bbb
                </div>
            </div>
            <div id="5">
                ccc
            </div>
        '''


regex = r"<div id=\"1\">"
result = balenceGroup(regex,text)
print(result)

输出结果如下:

    <div id="1">
                <div id="2">
                    <div id="3">
                        aaa
                    </div>
                </div>
                <div id="4">
                    bbb
                </div>
            </div>
[Finished in 0.1s]
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值