【问题标题】:how to make this regex only find the first match如何使这个正则表达式只找到第一个匹配项
【发布时间】:2017-01-26 09:45:56
【问题描述】:

我知道使用 Regex 解析 html 代码在技术上是不正确的,但在开始这个项目时发现这一点太远了(我已经说过我将使用 Regex 为时已晚无法返回的一些课程作业现在开始)

我正在尝试制作一个 python 程序,它需要一个 html 文档,去掉 card-count 类之后包含的数字,然后将它们附加到一个列表中,问题是它似乎在运行时没有找到第一个匹配项要找到第一个和所有其他与第一个相同的,依此类推,这里是一些示例 html 和我的正则表达式:

              <span class="card-count">1</span>
          <span class="card-name"><a href="http://gatherer.wizards.com/Pages/Search/Default.aspx?name=+%5BGarruk%5D+%5BRelentless%5D" data-src="http://gatherer.wizards.com/Handlers/Image.ashx?type=card&amp;name=Garruk+Relentless" data-mp4="http://magic.wizards.com/" data-webm="http://magic.wizards.com/" data-gif="http://magic.wizards.com/" class="deck-list-link">Garruk Relentless</a></span>
        </span>

                                                <span class="row">
          <span class="card-count">2</span>
          <span class="card-name"><a href="http://gatherer.wizards.com/Pages/Search/Default.aspx?name=+%5BJace,%5D+%5Bthe%5D+%5BMind%5D+%5BSculptor%5D" data-src="http://gatherer.wizards.com/Handlers/Image.ashx?type=card&amp;name=Jace%2C+the+Mind+Sculptor" data-mp4="http://magic.wizards.com/" data-webm="http://magic.wizards.com/" data-gif="http://magic.wizards.com/" class="deck-list-link">Jace, the Mind Sculptor</a></span>
        </span>


  </div>


  <div class="sorted-by-creature clearfix element">


    <h5>Creature (16)</h5>

                                      <span class="row">
          <span class="card-count">4</span>
          <span class="card-name"><a href="http://gatherer.wizards.com/Pages/Search/Default.aspx?name=+%5BDeathrite%5D+%5BShaman%5D" data-src="http://gatherer.wizards.com/Handlers/Image.ashx?type=card&amp;name=Deathrite+Shaman" data-mp4="http://magic.wizards.com/" data-webm="http://magic.wizards.com/" data-gif="http://magic.wizards.com/" class="deck-list-link">Deathrite Shaman</a></span>
        </span>

                                                <span class="row">
          <span class="card-count">4</span>
          <span class="card-name"><a href="http://gatherer.wizards.com/Pages/Search/Default.aspx?name=+%5BNoble%5D+%5BHierarch%5D" data-src="http://gatherer.wizards.com/Handlers/Image.ashx?type=card&amp;name=Noble+Hierarch" data-mp4="http://magic.wizards.com/" data-webm="http://magic.wizards.com/" data-gif="http://magic.wizards.com/" class="deck-list-link">Noble Hierarch</a></span>
        </span>

                                                <span class="row">
          <span class="card-count">4</span>
          <span class="card-name"><a href="http://gatherer.wizards.com/Pages/Search/Default.aspx?name=+%5BStoneforge%5D+%5BMystic%5D" data-src="http://gatherer.wizards.com/Handlers/Image.ashx?type=card&amp;name=Stoneforge+Mystic" data-mp4="http://magic.wizards.com/" data-webm="http://magic.wizards.com/" data-gif="http://magic.wizards.com/" class="deck-list-link">Stoneforge Mystic</a></span>
        </span>

                                                <span class="row">
          <span class="card-count">4</span>
          <span class="card-name"><a href="http://gatherer.wizards.com/Pages/Search/Default.aspx?name=+%5BTrue-Name%5D+%5BNemesis%5D" data-src="http://gatherer.wizards.com/Handlers/Image.ashx?type=card&amp;name=True-Name+Nemesis" data-mp4="http://magic.wizards.com/" data-webm="http://magic.wizards.com/" data-gif="http://magic.wizards.com/" class="deck-list-link">True-Name Nemesis</a></span>
        </span>


  </div>


  <div class="sorted-by-sorcery clearfix element">


    <h5>Sorcery (3)</h5>

                                      <span class="row">
          <span class="card-count">3</span>
          <span class="card-name"><a href="http://gatherer.wizards.com/Pages/Search/Default.aspx?name=+%5BPonder%5D" data-src="http://gatherer.wizards.com/Handlers/Image.ashx?type=card&amp;name=Ponder" data-mp4="http://magic.wizards.com/" data-webm="http://magic.wizards.com/" data-gif="http://magic.wizards.com/" class="deck-list-link">Ponder</a></span>
        </span>

而python代码是:

card_number_list=[]
number_of_cards=int(0)
    #find out how many of x cards there are in the deck
def card_number_regex(card_number_list):
    global number_of_cards
    global html
    number_in_set= re.search("card-count.*",html)
    get_rid= re.search("card-count.*",html).group(0)
    html=html.replace(get_rid,"")
    number_in_set=number_in_set.group(0)
    html=html.replace(number_in_set, "")
    number_in_set=number_in_set.replace('card-count">',"")
    number_in_set=number_in_set.replace('</span>', "")
    card_number_list.append(number_in_set)
    number_in_set_int=int(number_in_set)
    print(number_in_set_int)
    number_of_cards=(number_of_cards+number_in_set_int)
    return number_of_cards

while number_of_cards<75:
    card_number_regex(card_number_list)

我运行它时得到的输出是 1 2 4 3

【问题讨论】:

标签: python regex python-3.x


【解决方案1】:

虽然许多人似乎对您选择使用正则表达式来完成此任务感到不满,但我认为这对于您的特定目标来说似乎并不太难,并且会为您的要求提供一个实际的答案.

import re
a = html
b = re.findall('<span class="card-count">(.*?)</span>',a)
print(b[0])

该正则表达式应在列表中提供您的卡片计数类的内容,并使用第一个索引仅检索您希望正则表达式找到的匹配项。

显然,这对于其他用例来说效果不佳,但是您似乎知道您只希望 html 文档中的第一次出现,列表包含所有这些并不重要,即使它们在另一个 div 标签等。

正如其他人所说,我不明白您为什么不为此使用常规的 html 解析器。

【讨论】:

  • 非常感谢,我只使用过正则表达式,因为我以前从未遇到过 html 解析,一位朋友建议我可以使用正则表达式,但我一定会研究它们以供进一步使用
  • 注意到我在代码中写错了,对不起!现在编辑代码块(不知何故设法键入“搜索”而不是“findall”。re.search 不提供列表,re.findall 提供)。
猜你喜欢
  • 1970-01-01
  • 2013-12-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-03
  • 1970-01-01
  • 2015-06-26
相关资源
最近更新 更多