Python正则表达式与换行符匹配

时间:2017-02-01 08:18:34

标签: python regex

我正在尝试一场没有运气的正则表达式比赛。我希望与此匹配

<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 ..到目前为止没有运气......任何想法?

4 个答案:

答案 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)

我建议不要使用纯正则表达式。 (根据你的评论)

您可以使用divBeautifulsoup内获取文字 请参阅: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

会抓住发布商。