[D]请求python的正则表达式匹配相关有关问题,求大神指点,
[D]请求python的正则表达式匹配相关问题,求大神指点,急
想用正则表达式去匹配抓取一个字段
但是这个字段匹配的时候是这样的规则:
假设字符串如下:
<table>....
<a id='22'>abc</a>
</table>
<table>....
<a id='22'>abc</a>
<b id='22'>abc</b>
</table>
目的是希望抓取每个table里符合<table>.*?<a id.*?>(.*?)</a>.*?</table>或者<table>.*?<a id.*?>(.*?)</a>.*?<b id='22'。*?>(.*?)</b>.*?</table>的数据,然后当是第一个table那种数据时获取abc,如果是第二种那种形式的话获取两个abc
当然目的是为了获取那三处abc的值。
但是我用<table>.*?<a id.*?>(.*?)</a>.*?[(<b id='22'。*?>(.*?)</b>)]+.*?</table>这样的正则表达式去抓取的时候发现有点小问题
我是这样做的
matches = pattern.finditer(s) ===》s是上述字符串内容
发现matches.groups只能为1,也就是说,接下来我用
for ele in matches :
print ele.lastindex
print ele.group(1)
只能调用group(1),也就是说只能获取到第一个abc,不能够当是第一个table的时候通过判断lastindex=1调用group(1)获取到abc,而当是第二种table数据时通过判断lastindex=2调用group(1),group(2)去获取到两个abc。
求教下python大神,这个怎么处理的?
本人晚上刚学python,可能有些地方描述不清楚,所以如果有疑问,麻烦指出来,我好再描述下,
谢谢,1点前在线等啊!
---------------------------
Double行动:
原帖分数:40
帖子加分:40
------解决方案--------------------
目的是为了获取那三处abc的值?
那就:
想用正则表达式去匹配抓取一个字段
但是这个字段匹配的时候是这样的规则:
假设字符串如下:
<table>....
<a id='22'>abc</a>
</table>
<table>....
<a id='22'>abc</a>
<b id='22'>abc</b>
</table>
目的是希望抓取每个table里符合<table>.*?<a id.*?>(.*?)</a>.*?</table>或者<table>.*?<a id.*?>(.*?)</a>.*?<b id='22'。*?>(.*?)</b>.*?</table>的数据,然后当是第一个table那种数据时获取abc,如果是第二种那种形式的话获取两个abc
当然目的是为了获取那三处abc的值。
但是我用<table>.*?<a id.*?>(.*?)</a>.*?[(<b id='22'。*?>(.*?)</b>)]+.*?</table>这样的正则表达式去抓取的时候发现有点小问题
我是这样做的
matches = pattern.finditer(s) ===》s是上述字符串内容
发现matches.groups只能为1,也就是说,接下来我用
for ele in matches :
print ele.lastindex
print ele.group(1)
只能调用group(1),也就是说只能获取到第一个abc,不能够当是第一个table的时候通过判断lastindex=1调用group(1)获取到abc,而当是第二种table数据时通过判断lastindex=2调用group(1),group(2)去获取到两个abc。
求教下python大神,这个怎么处理的?
本人晚上刚学python,可能有些地方描述不清楚,所以如果有疑问,麻烦指出来,我好再描述下,
谢谢,1点前在线等啊!
---------------------------
Double行动:
原帖分数:40
帖子加分:40
------解决方案--------------------
目的是为了获取那三处abc的值?
那就:
- Python code
import re string = """ <table>.... <a id='22'>abc</a> </table> <table>.... <a id='22'>abcd</a> <b id='22'>abcde</b> </table> """ patten = "<\w id='22'>.+?</\w>" temp_list = re.findall( patten , string) for i in temp_list: print i.split('>')[1][:-3]
------解决方案--------------------
- Python code
#!/usr/bin/env python import re text = ''' <d id='1'>i don't want to gei it</d> <table>......</table> <table>.... <d id='22'>sdfsdfs</d> <a id='11'>i want get it 1</a> </table> <b id='333'>sdfvcxv</b> <b id='333'>i don't want to gei it</b> <table>.... <a id='11'>i want get it 2</a> <b>sdfsdf</b> <b id='333'>i want get it 3</b> </table> <b id='333'>i don't want to get it</b> ''' #$text =~ s:\n::g; #$text =~ s:(?<=</table>)(?=.):\n:gi; #$text =~ s:^.*?(?=<table>)::gmi; #$text =~ s:^((?!<table>).)*$::gmi; tmp = text.replace("\n", "") tmp = tmp.replace("</table>", "</table>\n"); tmp = re.sub(r'^.*?(?=<table)', '', tmp, flags = re.I | re.U | re.M) tmp = re.sub(r'^((?!<table>).)*$', '', tmp, flags = re.I | re.U | re.M) res = re.findall(r'''<(\w+) id='(?:11|333)'>([^<]*)</\1>''', tmp, re.I | re.U) if res: res = [w[1] for w in res] print res