使用python正则表达式打开<;ul>&书信电报;李>;并将无界项添加到列表中

使用python正则表达式打开<;ul>&书信电报;李>;并将无界项添加到列表中,python,regex,html-lists,Python,Regex,Html Lists,我想将我的文本放在下面,并将其组合成如下所示的对象列表。我知道这可以通过正则表达式来实现。请帮忙 正在启动html文本: peanut butter1 <ul id="ul0002" list-style="none">peanut butter2 <li id="ul0002-0001" num="0000">2.0 to 6.0 mg of 17&#x3b2;-estradiol and</li> <li id="ul0002

我想将我的文本放在下面,并将其组合成如下所示的对象列表。我知道这可以通过正则表达式来实现。请帮忙

正在启动html文本:

peanut butter1
<ul id="ul0002" list-style="none">peanut butter2
    <li id="ul0002-0001" num="0000">2.0 to 6.0 mg of 17&#x3b2;-estradiol and</li>
    <li id="ul0002-0002" num="0000">0.020 mg of ethinylestradiol;</li>
    <br>
    <li id="ul0002-0003" num="0000">0.25 to 0.30 mg of drospirenone and</li>peanut butter3
</ul>peanut butter4
花生酱1 花生酱2
  • 2.0至6.0毫克的17β-雌二醇和
  • 0.020毫克乙炔雌二醇
  • 0.25至0.30毫克屈螺旋酮和花生酱3 花生酱4 期望输出:

    list = [
        ['peanut butter1', 'no tag'],
        ['peanut butter2', 'ul'],
        ['2.0 to 6.0 mg of 17&#x3b2;-estradiol and', 'li'],
        ['0.020 mg of ethinylestradiol;', 'li'],
        ['<br>', 'no tag'],
        ['0.25 to 0.30 mg of drospirenone and', 'li'],
        ['peanut butter3', 'no tag'],
        ['peanut butter4', 'no tag'],
    ]
    
    列表=[
    [“花生酱1”,“无标签”],
    [‘花生酱2’,‘ul’],
    ['2.0至6.0 mg 17β;-雌二醇和'li'],
    ['0.020毫克乙炔雌二醇;','li'],
    [“
    ”,“无标签”], ['0.25至0.30 mg屈螺旋酮和'li'], [“花生酱3”,“无标签”], [“花生酱4”,“无标签”], ]
    我同意前面关于解析HTML的评论。但是,为了好玩并假设是逐行解析,您可以尝试以下方法:

    ss="""
    peanut butter1
    <ul id="ul0002" list-style="none">peanut butter2
        <li id="ul0002-0001" num="0000">2.0 to 6.0 mg of 17&#x3b2;-estradiol and</li>
        <li id="ul0002-0002" num="0000">0.020 mg of ethinylestradiol;</li>
        <br>
        <li id="ul0002-0003" num="0000">0.25 to 0.30 mg of drospirenone and</li>peanut butter3
    </ul>peanut butter4
    """
    import re
    tags = re.compile (r".*?<([^/]\w*?) .*?>(.*?)</\1>") # find tag like <li ...>...</li>
    start = re.compile(r".*?<([^/]\w*?) .*?>(.*)") # find starting tags with attributes
    end = re.compile(r"</.*?>")
    r=[]
    for s in ss.split("\n"):
        if not s.strip(): continue
        st = re.match(start,s)
        if st: # start tag exists
            m = re.match(tags,s) 
            if m: # full terminated tag
                r.append(list(reversed(m.groups())))
                extra = s[m.end():].strip()
                if extra:
                    r.append([extra,"no tag"])
            else: # half tag start
                r.append(list(reversed(st.groups())))
        else: # no start tag
            s = re.sub(end, "", s) # remove closing tags
            r.append([s.strip(),"no tag"])
    print "\n".join([str(s) for s in r])
    
    ss=”“”
    花生酱1
    花生酱2
    
  • 2.0至6.0毫克的17-雌二醇和
  • 0.020毫克乙炔雌二醇

  • 0.25至0.30毫克屈螺旋酮和花生酱3 花生酱4 """ 进口稀土 tags=re.compile(r“.*?(.*?))#查找像
  • start=re.compile(r.“*?(.*))#查找具有属性的起始标记 end=re.compile(r“”) r=[] 对于ss.split中的s(“\n”): 如果不是s.strip():继续 st=重新匹配(开始,s) 如果st:#开始标记存在 m=重新匹配(标签,s) 如果m:#完全终止标记 r、 追加(列表(反向(m.groups())) extra=s[m.end():].strip() 如果额外: r、 追加([额外,“无标记”]) 其他:#半标签开始 r、 追加(列表(反向(st.groups())) 其他:#无开始标记 s=re.sub(结束,“,s)#删除结束标记 r、 追加([s.strip(),“无标记”]) 打印“\n”.join([str(s)表示r中的s])

    希望这有帮助

    不!不要使用正则表达式来解析HTML!您可能应该使用类似于
    BeautifulSoup
    的东西。请阅读:Answer正则表达式不适合解析任意嵌套的结构。改用解析器。好的,谢谢大家的指导。我已经用了相当多的有限刮削。当htlm编写得不好时(例如,不平衡的标记),它有时比实际的解析器甚至BS更健壮,并且可以更快。