如何在regexp中重复一个组?

时间:2017-08-22 05:18:08

标签: python regex

我的python代码有问题。

import re
page = '<ul id="talkList" class=aaaaaa <li class>First</li><li 
class>Second</li><li class>Third</li>...'
pattern = re.compile(r'<ul id="talkList".*?(<li.*?</li>)', re.S)
stories = re.findall(pattern, page)
for story in stories:
    print story

现在的结果是:

<li class>First</li>

但我希望结果是:

<li class>First</li>
<li class>Second</li>
<li class>Third</li>

我想匹配小组(<li.*?</li>) 0或无限次。

我该怎么办?

谢谢!

5 个答案:

答案 0 :(得分:0)

Zero or More  =>  (<li.*?</li>){0,}

答案 1 :(得分:0)

使用star运算符:

txt = 'abbabaa'
re.findall(r'(ab)*', txt)

输出:

['ab', '', 'ab', '', '', '']

注意

匹配0或更多将匹配空字符串,我不确定你需要什么。

建议

如果您使用的是re.findall,则无需匹配一个结果中的所有li个元素,因为所有匹配项都会从findall返回。

首先使用<ul>...</ul>捕获re.search()块。 然后在生成的ul文本

上使用<li></li>分隔每个re.findall()元素

建议二

使用lxmlbs4来解析html对象,比编写自己的正则表达式来查找html元素更简单。

答案 2 :(得分:0)

您可以尝试使用下面的正则表达式。

pattern = re.compile(r'(<li.*?</li>)', re.S)

这将按预期工作。

答案 3 :(得分:0)

查看tfidf = TfidfVectorizer(stop_words='english') 的文档:

re.findall()

您的RE在您的字符串中只有一个匹配项,因为只有一个 findall(pattern, string, flags=0) Return a list of all non-overlapping matches in the string. If one or more groups are present in the pattern, return a list of groups; this will be a list of tuples if the pattern has more than one group. Empty matches are included in the result. 可以匹配。由于您的RE中有(一个)组,'<ul id="talkList"'会返回该组。

如果您只使用re.findall()作为您的RE,那么'<li.*?</li>'会找到三场比赛并返回所有三场比赛:

re.findall()

输出:

import re
page = '<ul id="talkList" class=aaaaaa <li class>First</li><li class>Second</li><li class>Third</li>...'
pattern = re.compile(r'<li.*?</li>', re.S)
stories = re.findall(pattern, page)
for story in stories:
    print story

答案 4 :(得分:0)

而不是

intentShare.putExtra(Intent.EXTRA_CONTENT,content);

使用

pattern = re.compile(r'<ul id="talkList".*?(<li.*?</li>)', re.S)

将解决您的问题