python - 在python中获取正则表达式的所有实例

标签 python regex

我正在尝试使用以下方法获取所有 innerHTML 链接

import re

s = '<div><a href="page1.html" title="page1">Go to 1</a>, <a href="page2.html" title="page2">Go to page 2</a><a href="page3.html" title="page3">Go to page 3</a>, <a href="page4.html" title="page4">Go to page 4</a></div>'
match = re.findall(r'<a.*>(.*)</a>', s)

for string in match:
    print(string)

但我只得到最后一次出现,“转到第 4 页” 我认为它看到一个大字符串和几个匹配的正则表达式,它们被视为重叠并被忽略。那么,如何获得匹配的集合

['转到第 1 页', '转到第 2 页', '转到第 3 页', '转到第 4 页']

最佳答案

您的直接问题是正则表达式是贪婪的,即它们将尝试尽可能消耗最长的字符串。所以你是对的,直到最后一个 </a>它可以。将其更改为非贪婪(.*?):

match = re.findall(r'<a.*?>(.*?)</a>', s)
                             ^

但是,这是一种可怕的 HTML 解析方式,而且不够健壮,而且会因最小的更改而中断。

这里有一个更好的方法:

from bs4 import BeautifulSoup

s = '<div><a href="page1.html" title="page1">Go to 1</a>, <a href="page2.html" title="page2">Go to page 2</a><a href="page3.html" title="page3">Go to page 3</a>, <a href="page4.html" title="page4">Go to page 4</a></div>'
soup = BeautifulSoup(s)
print [el.string for el in soup('a')]
# [u'Go to 1', u'Go to page 2', u'Go to page 3', u'Go to page 4']

然后,您可以使用它的强大功能来获取 href 和文本,例如:

print [[el.string, el['href'] ]for el in soup('a', href=True)]
# [[u'Go to 1', 'page1.html'], [u'Go to page 2', 'page2.html'], [u'Go to page 3', 'page3.html'], [u'Go to page 4', 'page4.html']]

关于python - 在python中获取正则表达式的所有实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17892093/

相关文章:

python - 使用 Anaconda 安装 PyX 失败

python - 杂波不会在断点之外更新屏幕

python - 基于列标签 DatetimeIndex 组合 DataFrame

c++ - 正则表达式不以零开头

python - 在正则表达式中,如何匹配字符串的两种不同情况

java - 从字符串中提取字段值

python - 使用 Lambda-python 对 DynamoDB 表的 sed 识别响应

regex - 如何在 Perl 中将变量作为正则表达式

javascript - 我们怎样才能将冒号之前的单词加粗,比如 aaaaa bb ccc 在 React js 中需要加粗

Python swig - 从 ctypes 指针创建 swig 包装实例