最近遇到一个需求,要获得一个网页上一个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]