Python RegEx-匹配可选组

Python RegEx-匹配可选组,python,regex,html-parsing,Python,Regex,Html Parsing,我知道正则表达式不是刮取HTMLs的最佳方法,但这就是它。。。 我有一些类似于: <td> Writing: <a href="creator.php?c=CCh">Carlo Chendi</a> Art: <a href="creator.php?c=LBo">Luciano Bottaro</a> </td> 写作:艺术: 我需要匹配写作和艺术部分。但并没有说它们在那里,可能还有其他的部分,比如墨水和铅笔 我该怎

我知道正则表达式不是刮取HTMLs的最佳方法,但这就是它。。。 我有一些类似于:

<td> Writing: <a href="creator.php?c=CCh">Carlo Chendi</a>  Art: <a href="creator.php?c=LBo">Luciano Bottaro</a> </td>
写作:艺术:
我需要匹配写作和艺术部分。但并没有说它们在那里,可能还有其他的部分,比如墨水和铅笔


我该怎么做?我需要使用纯正则表达式,不需要额外的Python库。

您可以使用?在可选部分之后?将匹配子表达式的0次或1次出现

regex = re.compile("(\w+):")
regex.findall(yourString); // returns an array of matching elements
你可以测试一下


PS:我强烈建议您仔细阅读

我最终创建了以下内容:

(Art:|Pencils:|Ink:|Writing:){0,4}.<a href="creator\.php\?c=[^">]*?\"\>(?P<Name>.*?)\</a\>
(艺术:|铅笔:|墨水:|书写:){0,4}.]*?\“\>(?P.*)\

这看起来很管用……也许可以擦一擦。你知道,我是初学者。

也许有两种模式需要识别

  • 你的关键字存在于一个
  • 您的关键字后面是一个…部分
  • 所以…首先提取s…(psuedo代码)中的所有内容

    while(匹配(“]*>(.*?)]*>”){
    内部=匹配[1];
    ...
    }
    
    (.*)
    表示不贪婪地匹配,即匹配尽可能小的值。否则,您将匹配从第一个
    到最后一个
    (而不是下一个
    )的所有内容


    然后你可以继续处理
    内部
    部分!

    尽管我之前的回答,我还是改变了主意,不想有选项/替代选项,而是要全部获得。因此,这意味着TD标签中的任何内容都必须被捕获并正确分类。 我需要创建一个可选的捕获组,这样无论布局如何,我仍然可以检索内容。 它应该与此配合使用,即:

    <td>   Art: <a href="creator.php?c=GPe">Giuseppe Perego</a> </td>
    <td> Writing: <a href="creator.php?c=CCh">Carlo Chendi</a>  Art: <a href="creator.php?c=LBo">Luciano Bottaro</a> </td>
    <td>  Pencils: <a href="creator.php?c=JB">Jack Bradbury</a> Ink: <a href="creator.php?c=SSt">Steve Steere</a> </td>
    <td>  Pencils: <a href="creator.php?c=JB">Jack Bradbury</a> Ink: <a href="creator.php?c=SSt">Steve Steere</a> </td>
    <td> Writing: <a href="creator.php?c=DKi">Dick Kinney</a> Pencils: <a href="creator.php?c=TS">Tony Strobl</a> Ink: <a href="creator.php?c=SSt">Steve Steere</a> </td>
    <td>  Pencils: <a href="creator.php?c=JB">Jack Bradbury</a> Ink: <a href="creator.php?c=SSt">Steve Steere</a> </td>
    <td> Writing: <a href="creator.php?c=BKa">Bob Karp</a> Pencils: <a href="creator.php?c=AT">Al Taliaferro</a> Ink: <a href="creator.php?c=AH">Al Hubbard</a> </td>    
    <td> Writing: <a href="creator.php?c=DKi">Dick Kinney</a> Pencils: <a href="creator.php?c=TS">Tony Strobl</a> Ink: <a href="creator.php?c=SSt">Steve Steere</a> </td>
    <td> Writing: <a href="creator.php?c=VLo">Vic Lockman</a>  Art: <a href="creator.php?c=KWr">Kay Wright</a> </td>
    <td> Writing: <a href="creator.php?c=MGa">Michele Gazzarri</a>  Art: <a href="creator.php?c=GPe">Giuseppe Perego</a> </td>
    
    艺术:
    写作:艺术:
    铅笔:墨水:
    铅笔:墨水:
    书写:铅笔:墨水:
    铅笔:墨水:
    书写:铅笔:墨水:
    书写:铅笔:墨水:
    写作:艺术:
    写作:艺术:
    
    我创建了:

    <td>\ {1,3}(?:(?:Writing: <a href="creator\.php\?c=[^>"]*?">(.*?)?</a>).*?)?(?:(?:Pencils: <a href="creator\.php\?c=[^>"]*?">(.*?)?</a>\ ))?(?:(?:Ink: <a href="creator\.php\?c=[^>"]*?">(.*?)?</a>))?(?:(?:Art: <a href="creator\.php\?c=[^>"]*?">(.*?)?</a>))?\ {1,3}</td>
    
    \{1,3}(?:(?:书写:).*?(?:(?:铅笔:\)(?:(?:墨水:)(?:(?:艺术:))?{1,3}
    
    而且它看起来像是在工作


    我非常感谢有人检查和验证我的努力。

    这不是“最好的方式”“,这不是一种方式。如果我要求你用面条钉钉子,那失败是我的错,不是你的错。是的,对。如果我不是被迫这样做的话我不会这么做。。。除非你对如何在没有Python附加库的情况下阅读html有什么建议…对不起,我不是故意让你觉得很刺耳…我真的不需要阅读所有的标签,只是一些特定的标签,所以我认为这是可以做到的。。。但我可能错了。。。谢谢如果人们不因为想要学习正则表达式而受到警告,那就太好了。在很多情况下,XML解析器的重量都高得离谱。想象一下,当初学者可以学习Java或C时,如何告诫他们不要学习BASIC或C。。再想想,我本可以简单地检索标记之间的名称,然后用Python将它们剥离……但我很享受!这里的困难在于处理多个匹配项。假设你在
    td
    s之间既有写作又有艺术。。。您将不知道要检查哪个匹配号。我建议采用多步骤流程。首先,提取
    td
    s中的所有内容。然后,在循环内全局匹配(即一次返回一个结果)。但是你似乎学会了正则表达式的语法。
    <td>\ {1,3}(?:(?:Writing: <a href="creator\.php\?c=[^>"]*?">(.*?)?</a>).*?)?(?:(?:Pencils: <a href="creator\.php\?c=[^>"]*?">(.*?)?</a>\ ))?(?:(?:Ink: <a href="creator\.php\?c=[^>"]*?">(.*?)?</a>))?(?:(?:Art: <a href="creator\.php\?c=[^>"]*?">(.*?)?</a>))?\ {1,3}</td>