【问题标题】:Why is regex failing to match all desired groups为什么正则表达式无法匹配所有所需的组
【发布时间】:2019-10-25 02:31:58
【问题描述】:

我有以下字符串

{class:"table table-striped"},c.a.createElement("thead",{class:"thread-dark"},c.a.createElement("tr",null,c.a.createElement("th",{scope:"col"},"Round 1"),c.a.createElement("th",{scope:"col"}),c.a.createElement("th",{scope:"col"}),c.a.createElement("th",{scope:"col"}),c.a.createElement("th",{scope:"col"}))),c.a.createElement("tbody",null,c.a.createElement("tr",null,c.a.createElement("td",null,"Parc des Princes",c.a.createElement("br",null),"Paris"),c.a.createElement("td",{align:"right"},"France ",c.a.createElement("img",{src:"img/RoundFlags/France.png",width:"50",hspace:"20"})),c.a.createElement("td",{className:"align-middle",align:"center"},c.a.createElement("a",{href:"/fra-kor"},"4 - 0")),c.a.createElement("td",{align:"left"},c.a.createElement("img",{src:"img/RoundFlags/Korea.png",width:"50",hspace:"20"})," Korea"),c.a.createElement("td",null,"Group A")),c.a.createElement("tr",null,c.a.createElement("td",null,"Roazhon Park",c.a.createElement("br",null),"Rennes"),c.a.createElement("td",{align:"right"},"Germany ",c.a.createElement("img",{src:"img/RoundFlags/Germany.png",width:"50",hspace:"20"})),c.a.createElement("td",{className:"align-middle",align:"center"},c.a.createElement("a",{href:"/deu-chn"},"1 - 0")),c.a.createElement("td",{align:"left"},c.a.createElement("img",{src:"img/RoundFlags/China.png",width:"50",hspace:"20"})," China"),c.a.createElement("td",null,"Group B")),c.a.createElement("tr",null,c.a.createElement("td",null,"Stade Oceane",c.a.createElement("br",null),"Le Havre"),c.a.createElement("td",{align:"right"},"Spain ",c.a.createElement("img",{src:"img/RoundFlags/Spain.png",width:"50",hspace:"20"})),c.a.createElement("td",{className:"align-middle",align:"center"}

我正在尝试检索 2 个相同子字符串之间的所有字符,即 c.a.createElement("tr"c.a.createElement("tr" 之间的所有字符作为列表。

我的尝试是使用以下正则表达式模式:

c\.a\.createElement\("tr"(.*?)c\.a\.createElement\("tr"

如图所示跳过了一些序列,而不是在序列之间获取每一个:

在上面你可以看到第二场比赛 1 第 0 组(浅蓝色)后面没有第 1 组(绿色),尽管有后续 c.a.createElement("tr"(第 2 场深蓝色)。

如果对正则表达式有帮助,请点击此处:https://regex101.com/r/xzbHBU/1/

我尝试了各种外观,例如

(?<=c\.a\.createElement\("tr")(.*?)(?!c\.a\.createElement\("tr")

并添加re.DOTALL 标志;由于过于严格,所有这些都不幸地无法匹配。

谁能帮我编写适当的正则表达式来检索我在期望中描述的所有组?

Python:

import re

s = '{class:"table table-striped"},c.a.createElement("thead",{class:"thread-dark"},c.a.createElement("tr",null,c.a.createElement("th",{scope:"col"},"Round 1"),c.a.createElement("th",{scope:"col"}),c.a.createElement("th",{scope:"col"}),c.a.createElement("th",{scope:"col"}),c.a.createElement("th",{scope:"col"}))),c.a.createElement("tbody",null,c.a.createElement("tr",null,c.a.createElement("td",null,"Parc des Princes",c.a.createElement("br",null),"Paris"),c.a.createElement("td",{align:"right"},"France ",c.a.createElement("img",{src:"img/RoundFlags/France.png",width:"50",hspace:"20"})),c.a.createElement("td",{className:"align-middle",align:"center"},c.a.createElement("a",{href:"/fra-kor"},"4 - 0")),c.a.createElement("td",{align:"left"},c.a.createElement("img",{src:"img/RoundFlags/Korea.png",width:"50",hspace:"20"})," Korea"),c.a.createElement("td",null,"Group A")),c.a.createElement("tr",null,c.a.createElement("td",null,"Roazhon Park",c.a.createElement("br",null),"Rennes"),c.a.createElement("td",{align:"right"},"Germany ",c.a.createElement("img",{src:"img/RoundFlags/Germany.png",width:"50",hspace:"20"})),c.a.createElement("td",{className:"align-middle",align:"center"},c.a.createElement("a",{href:"/deu-chn"},"1 - 0")),c.a.createElement("td",{align:"left"},c.a.createElement("img",{src:"img/RoundFlags/China.png",width:"50",hspace:"20"})," China"),c.a.createElement("td",null,"Group B")),c.a.createElement("tr",null,c.a.createElement("td",null,"Stade Oceane",c.a.createElement("br",null),"Le Havre"),c.a.createElement("td",{align:"right"},"Spain ",c.a.createElement("img",{src:"img/RoundFlags/Spain.png",width:"50",hspace:"20"})),c.a.createElement("td",{className:"align-middle",align:"center"}'
p = re.compile(r'c\.a\.createElement\("tr"(.*?),c.a.createElement\("tr"')
matches = p.findall(s)
print(len(matches))

【问题讨论】:

    标签: python regex python-3.x


    【解决方案1】:

    使用前瞻和后瞻

    例如:

    import re
    
    s = '{class:"table table-striped"},c.a.createElement("thead",{class:"thread-dark"},c.a.createElement("tr",null,c.a.createElement("th",{scope:"col"},"Round 1"),c.a.createElement("th",{scope:"col"}),c.a.createElement("th",{scope:"col"}),c.a.createElement("th",{scope:"col"}),c.a.createElement("th",{scope:"col"}))),c.a.createElement("tbody",null,c.a.createElement("tr",null,c.a.createElement("td",null,"Parc des Princes",c.a.createElement("br",null),"Paris"),c.a.createElement("td",{align:"right"},"France ",c.a.createElement("img",{src:"img/RoundFlags/France.png",width:"50",hspace:"20"})),c.a.createElement("td",{className:"align-middle",align:"center"},c.a.createElement("a",{href:"/fra-kor"},"4 - 0")),c.a.createElement("td",{align:"left"},c.a.createElement("img",{src:"img/RoundFlags/Korea.png",width:"50",hspace:"20"})," Korea"),c.a.createElement("td",null,"Group A")),c.a.createElement("tr",null,c.a.createElement("td",null,"Roazhon Park",c.a.createElement("br",null),"Rennes"),c.a.createElement("td",{align:"right"},"Germany ",c.a.createElement("img",{src:"img/RoundFlags/Germany.png",width:"50",hspace:"20"})),c.a.createElement("td",{className:"align-middle",align:"center"},c.a.createElement("a",{href:"/deu-chn"},"1 - 0")),c.a.createElement("td",{align:"left"},c.a.createElement("img",{src:"img/RoundFlags/China.png",width:"50",hspace:"20"})," China"),c.a.createElement("td",null,"Group B")),c.a.createElement("tr",null,c.a.createElement("td",null,"Stade Oceane",c.a.createElement("br",null),"Le Havre"),c.a.createElement("td",{align:"right"},"Spain ",c.a.createElement("img",{src:"img/RoundFlags/Spain.png",width:"50",hspace:"20"})),c.a.createElement("td",{className:"align-middle",align:"center"}'
    p = re.compile(r'(?<=c\.a\.createElement\("tr")(.*?)(?=,c.a.createElement\("tr")')
    matches = p.findall(s)
    print(matches)
    

    输出:

    3
    

    【讨论】:

      猜你喜欢
      • 2013-10-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-31
      • 1970-01-01
      相关资源
      最近更新 更多