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]

猜你喜欢

转载自blog.csdn.net/maosijunzi/article/details/80092121