我正在尝试一场没有运气的正则表达式比赛。我希望与此匹配
<div class="row">
Published
September 17th 2013
by Smashwords
</div>
这是我的正则表达式
re.search(r"""<div class="row">\n Published\n (.*) (.*) (.*)\n by (.*)\n </div>""", page2, re.DOTALL|re.M)
我想匹配日期和Smashwords ..到目前为止没有运气......任何想法?
答案 0 :(得分:2)
您需要考虑正则表达式模式中的空格。这是一种工作模式:
<div class="row">\n\s+Published\n\s+(\S*) (.*) (.*)\n\s+by (\S*)\n\s+</div>
(changes:) ^^^ ^^^ ^^ ^^^ ^^ ^^^
它会给出结果('September', '17th', '2013', 'Smashwords')
答案 1 :(得分:1)
使用BeautifulSoup解析HTML代码可能是更好的选择。
import bs4
html = '''<div class="row">
Published
September 17th 2013
by Smashwords
</div>'''
soup = bs4.BeautifulSoup(html, 'lxml')
#--------This is acuture code, just one line-------#
soup.get_text(strip=True).split('\n ')
出:
['Published', 'September 17th 2013', ' by Smashwords']
答案 2 :(得分:0)
此正则表达式分别捕获第1,2,3和4组中的日期和Smashwords:
import re
x =re.match(r'<div class="row">\n[ ]+Published\n\s+([A-Za-z]+) ([A-Za-z0-9]+) ([0-9]+)\n\s+by ([A-Za-z0-9]+)\n\n\s+</div>', data, re.DOTALL|re.M)
print(x.group(1))
您的脚本的主要问题是没有考虑空格。
答案 3 :(得分:0)
我建议不要使用纯正则表达式。 (根据你的评论)
您可以使用div
在Beautifulsoup
内获取文字
请参阅:https://stackoverflow.com/a/21290018/4954434
现在使用[a-z,A-Z]*\s([0-2][0-9]|3[0-1])th\s[0-9]{4}
查找日期
然后找到发布者,假设它是&#34; by&#34;。
假设a = "text inside <div>"
,
b=a.split()
s = ''
for w in reversed(b):
if w == 'by':
break
else:
s = w + ' ' + s
会抓住发布商。