【发布时间】:2013-09-24 13:31:48
【问题描述】:
- 我知道,一般来说,您不应该在 HTML 中使用 Regex。我将它用作一次性工具,以快速从具有恒定模式的文件中删除一些数据,并且永远不会再次使用它。我想使用正则表达式来完成这项任务。 我了解您不应该使用 Regex 解析 HTML。
- 不,我不想使用 XMl Parser、BeautifulSoup、lxml 等。谢谢。 :)
- 我只想一次性使用它,然后永远用完。
话虽如此,我写的正则表达式只匹配文件中的最后一个“匹配”。我不确定为什么。该文件具有相当恒定的模式:
<p someAttribute="yes"><b someOtherAttribute="no">My Title - </b> My Description</p>
<p someAttribute="yes"><b someOtherAttribute="no">My 2nd Title - </b> My 2nd Description</p>
<p someAttribute="yes"><b someOtherAttribute="no">My 3rd Title - </b> My 3rd Description</p>
<p class="normal" style="margin-left:1"><b style="font-weight:400">Another one </b>The cake is a lie</p>
我不关心属性。我正在尝试对 <b> 标签中的内容和后面的内容进行分组。标题和说明。
def parseData(html):
pattern = re.compile('.*<p.*><b.*>(.+)</b>(.+)</p>.*')
matches = re.findall(pattern, str(html))
for match in matches:
print(match)
def main():
htmlFile = "myFile.htm"
browser = UrlBrowser()
parseData(browser.getHTML(htmlFile))
此模式仅匹配最后一个可用的“匹配” - 我之前尝试添加 .* 以查看是否会出现问题,但这并没有什么不同。我在正则表达式中遗漏了什么?
【问题讨论】:
-
它似乎工作:fiddle.re/mrban
-
"我知道您不应该使用 Regex 解析 HTML。"然而你却在搞乱它们而不是像
[elem.next + elem.next.next for elem in soup.find_all("b")]这样的东西,打字所花的时间比你发布问题所花的时间要少.. ;^) 你似乎认为使用正则表达式会不优雅但很快就可以开始工作,但这个问题本身表明并非如此。 -
这并不是“什么是最快和最容易的”开始工作的问题,更多的是“我想尝试一下,看看我能用它做什么,即使它是乱。”我确实最终玩弄了 BeautifulSoup,但最终我以一种完全不同于 HTML 相关或正则表达式的方式完成了它。 (我确实了解了很多关于为什么说不使用正则表达式。)
标签: python regex python-3.x