【问题标题】:python re, multiple matching groupspython re,多个匹配组
【发布时间】:2013-07-20 16:31:10
【问题描述】:

我有一个字符串:

s = '&nbsp;<span>Mil<\/span><\/th><td align=\"right\" headers=\"Y0 i7\">112<\/td><td align=\"right\" headers=\"Y1 i7\">113<\/td><td align=\"right\" headers=\"Y2 i7\">110<\/td><td align=\"right\" headers=\"Y3 i7\">107<\/td><td align=\"right\" headers=\"Y4 i7\">105<\/td><td align=\"right\" headers=\"Y5 i7\">95<\/td><td align=\"right\" headers=\"Y6 i7\">95<\/td><td align=\"right\" headers=\"Y7 i7\">87<\/td><td align=\"right\" headers=\"Y8 i7\">77<\/td><td align=\"right\" headers=\"Y9 i7\">74<\/td><td align=\"right\" headers=\"Y10 i7\">74<\/td><\/tr>'

我想从字符串中提取这些数字:

112 113 110 107 105 95 95 87 77 74 74

我不是正则表达式方面的专家,所以谁能告诉我,为什么这没有返回任何匹配项:

p = re.compile(r'&nbsp;.*(>\d*<\\/td>.*)*<\\/tr>')
m = p.match(s)

我确定有一个 html/xml 解析模块可以解决我的问题,我也可以拆分字符串并处理该输出,但我真的想用 re 模块来做。谢谢!

【问题讨论】:

    标签: python regex python-3.x


    【解决方案1】:
    >>> r = re.compile(r'headers="Y\d+ i\d+">(\d+)<\\/td>')
    >>> r.findall(s)
    ['112', '113', '110', '107', '105', '95', '95', '87', '77', '74', '74']
    >>> 
    

    【讨论】:

    • 这个解决方案比较明确,所以我选择它作为正确答案。谢谢。
    【解决方案2】:

    您想要的所有数字都在“>”和“

    re.findall(">(\d+)<", s)
    

    输出:

    ['112', '113', '110', '107', '105', '95', '95', '87', '77', '74', '74']
    

    基本上,它是说获取介于“>”和“set,您只能获得唯一的。

    【讨论】:

    • 我喜欢这个答案,因为它很简单。谢谢。
    【解决方案3】:

    其他答案给出了可以工作的正则表达式,但值得理解为什么你的正则表达式不能。

    你所有的匹配都是贪婪的和可选的 (*)。所以你的正则表达式说:

    • &amp;nbsp;
    • 0 个或多个字符的任何内容
    • 您的捕获组出现 0 次或多次
    • &lt;/tr&gt;

    "0 or more characters of anything" 吃掉字符串的其余部分,不为捕获组留下任何内容,并且由于它是可选的,因此成功匹配。

    如果你想重新设计你的正则表达式来工作,你会想使用.*?而不是.*来匹配字符串开头的垃圾。 ? 使匹配不贪婪,因此它将匹配尽可能少的字符而不是尽可能多的字符。

    【讨论】:

    • 感谢您解释我的模式出了什么问题。你可能没有给我答案,但你的帖子对我最有用。我坐下来做了一个教程并阅读了关于正则表达式的 Python 标准库。谢谢。
    【解决方案4】:

    您的表达式没有返回任何匹配项,因为我写的有点错误。而不是打印:

    p = re.compile(r'&nbsp;.*(>\d*<\\/td>.*)*<\\/tr>')
    m = p.match(s) 
    

    你可能应该打印这个:

    >>> p = re.compile(r'headers="Y\d+ i\d+">(\d+)<\\/td>')
    >>> p.findall(s)
    ['112', '113', '110', '107', '105', '95', '95', '87', '77', '74', '74'] 
    

    【讨论】:

    • 这正是张扬宇12分钟前写的。为什么不给他的答案投票呢?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-10-04
    • 2017-10-08
    • 1970-01-01
    • 2010-12-07
    • 2012-02-13
    • 2011-04-18
    • 1970-01-01
    相关资源
    最近更新 更多