Python使用re.findall返回一个查询的列表

使用re.search或match返回一个查询的列表,在遍历返回值的时候出现错误,因为返回值需要通过groups或group的方式才能正确取值。

lsa = re.search('/(%[A-Za-z0-9][A-Za-z0-9])+', dstr, flags=re.M|re.S|re.I)
        self.spider_pdf();
        for link in lsa:
            link = link[0:link.rfind("#")]

报错如下:

for link in lsa:
TypeError: '_sre.SRE_Match' object is not iterable

使用findall即可,习惯使用BeautifulSoup的findall,以为re模块没有findall,其实re有findall。findall的英文提示Return a list of all non-overlapping matches in the string。
代码如下

lsa = re.findall('/(%[A-Za-z0-9][A-Za-z0-9])+', dstr, flags=re.M|re.S|re.I)
for link in lsa:
      link = link[0:link.rfind("#")]

由于()表示的是连续的字符,在findall中()也表示要查找的值。所以以上的代码返回的lsa是错误的。正却的代码如下

lsa = re.findall(', dstr, flags=re.M|re.S|re.I)
        for link in lsa:
            link = link[0];

其中lsa的格式如下

[('/%E6%B8%A9%E5%B8%83%E5%B0%94%E7%99%BB%E7%BD%91%E7%90%83%E9%94%A6%E6%A0%87%E8%B5%9B', '%9B'), ('/%E5%9C%8B%E9%9A%9B%E7%B6%B2%E7%90%83%E7%B8%BD%E6%9C%83', '%83'), 
('/wiki/%E7%B6%B2%E7%90%83%E6%8B%8D', '%8D')]

你可能感兴趣的:(python)