如何在Python中提取两个字符串之间的字符串?

19

如果我有一个字符串 str1 = "IWantToMasterPython"

如果我想从上面的字符串中提取 "Py",我会写:

extractedString = foo("Master","thon")
我之所以要做这一切,是因为我正在尝试从一个HTML页面中提取歌词。 歌词的格式为<div class = "lyricbox"> ....歌词在这里....</div>。有什么建议可以实现吗?
5个回答

33

解决方法是使用正则表达式:

import re
r = re.compile('Master(.*?)thon')
m = r.search(str1)
if m:
    lyrics = m.group(1)

1
回答得很好。正是我想知道的。谢谢。 - shadyabhi

11

BeautifulSoup是实现你所需的最简单的方法。它可以像这样安装:

sudo easy_install beautifulsoup

您想要的示例代码如下:

执行您所需操作的示例代码如下:

from BeautifulSoup import BeautifulSoup

doc = ['<div class="lyricbox">Hey You</div>']
soup = BeautifulSoup(''.join(doc))
print soup.find('div', {'class': 'lyricbox'}).string

你可以使用Python的urllib直接从URL获取内容。如果您想进行更多的解析,Beautiful Soup文档也很有帮助。

1
这绝对是他所说的使用方式的正确方法。 - wxs
1
说得好。那正是我的目的所在。 这真的很有帮助。 - shadyabhi

9
def foo(s, leader, trailer):
  end_of_leader = s.index(leader) + len(leader)
  start_of_trailer = s.index(trailer, end_of_leader)
  return s[end_of_leader:start_of_trailer]

如果字符串s中不存在leader,或者在leader后面不存在trailer,那么这将引发ValueError错误(您尚未指定您希望在这种异常情况下采取的行为;引发异常是一种很自然和Pythonic的做法,让调用者使用try/except处理这种情况,如果它知道如何处理这些情况)。

基于RE的方法也是可能的,但我认为这种纯字符串方法更简单。


2
如果您想将所有出现的结果输出到列表中,也可以尝试以下方法:
import re
str1 = "IWantToMasterPython"

out  = re.compile('Master(.*?)thon', re.DOTALL |  re.IGNORECASE).findall(str1)
if out :
    print out

2
如果您要从HTML页面中提取任何数据,我强烈建议使用BeautifulSoup库。我也用它来从HTML中提取数据,效果非常好。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接