Python正则表达式:如何从正则中提取内部数据
我想从这样的正则表达式中提取数据:
<td>[a-zA-Z]+</td><td>[\d]+.[\d]+</td><td>[\d]+</td><td>[\d]+.[\d]+</td>
我找到了一些相关的问题,像是如何提取正则表达式的内容,但是在我的情况下,我需要以某种方式进行迭代。
2 个回答
0
发帖者已经说明了,<td> 标签应该从字符串中去掉。
需要注意的是,你给我们的这个字符串,实际上就是一个普通的字符串。只有在使用正则表达式的情况下,它才算是正则表达式(可以从中编译出一个正则表达式对象)。
你可以很简单地去掉 <td> 标签(假设你的字符串存储在 s
中):
s.replace('<td>','').replace('</td>','')
不过要注意一些问题:在处理真实的HTML时,这种方法的用处非常有限,正如其他人所指出的那样。
此外,你还应该知道,剩下的正则表达式 [string] 可能无法解析出你想要的内容,也就是说,没有 <td> 标签后,它不会自动匹配之前匹配到的任何东西!
7
正如paprika在评论中提到的,你需要用括号()来标记你想要提取的文本部分,这样可以设置捕获组。要获取
<td>[a-zA-Z]+</td><td>[\d]+.[\d]+</td><td>[\d]+</td><td>[\d]+.[\d]+</td>
改成:
<td>([a-zA-Z]+)</td><td>([\d]+.[\d]+)</td><td>([\d]+)</td><td>([\d]+.[\d]+)</td>
^^^^^^^^^ ^^^^^^^^^^^ ^^^^^ ^^^^^^^^^^^
group 1 group 2 group 3 group 4
然后通过数字来访问这些组。 (第一行只是为了帮助你看到括号指定的捕获组,带有'^'的那一行和命名组的行只是辅助信息。)
dataPattern = re.compile(r"<td>[a-zA-Z]+</td>... etc.")
match = dataPattern.find(htmlstring)
field1 = match.group(1)
field2 = match.group(2)
以此类推。不过你要知道,使用正则表达式来解析HTML源代码可能会让你感到很头疼。你的输入HTML中可能会有很多意想不到的情况,这些都是有效的HTML,但很容易让你的正则表达式失效:
"<TD>"而不是"<td>"
标签之间,或者数据和标签之间的空格
" "这样的空格字符
像BeautifulSoup、lxml,甚至pyparsing这样的库会让你写的网页抓取程序更加稳健。