首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >贪婪regex查找

贪婪regex查找
EN

Stack Overflow用户
提问于 2019-09-10 00:47:59
回答 3查看 111关注 0票数 1

我正在编写一个正则表达式来获取""之间的数据。我遇到的唯一问题是最后一个"被捕获了。正则表达式

代码语言:javascript
复制
  line = '<DT><A HREF="https://cheatsheetseries.owasp.org/cheatsheets/Clickjacking_Defense_Cheat_Sheet.html" ADD_DATE="1567455957">Clickjacking Defense · OWASP Cheat Sheet Series</A>'
  capture_regex = re.compile(r'(?<=HREF=").*?"',re.IGNORECASE)
  m = capture_regex.search(line)

m.group()打印https://cheatsheetseries.owasp.org/cheatsheets/Clickjacking_Defense_Cheat_Sheet.html"。如何在不包括最后引号的情况下编写regex。

回答了我的问题。我补充说,我把所谓的非贪婪的东西加到了我的领地上。capture_regex = re.compile(r'(?<=HREF=").*?(?=")',re.IGNORECASE)。通过在?之后添加*,使其仅在第一个"处停止。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-09-10 01:26:51

代码语言:javascript
复制
capture_regex = re.compile(r'(?<=HREF=").*?(?=")',re.IGNORECASE)

工作小提琴

编辑:调整正则表达式,因为它太贪婪了。感谢@newdeveloper指出它!

票数 1
EN

Stack Overflow用户

发布于 2019-09-10 04:10:23

也许,来自bs4的bs4可以正常工作:

代码语言:javascript
复制
from bs4 import BeautifulSoup

line = '<DT><A HREF="https://cheatsheetseries.owasp.org/cheatsheets/Clickjacking_Defense_Cheat_Sheet.html" ADD_DATE="1567455957">Clickjacking Defense · OWASP Cheat Sheet Series</A>'
soup = BeautifulSoup(line, 'html.parser')

for l in soup.find_all('a', href=True):
    print(l['href'])

输出

代码语言:javascript
复制
https://cheatsheetseries.owasp.org/cheatsheets/Clickjacking_Defense_Cheat_Sheet.html

如果不是,也许,一些类似于

代码语言:javascript
复制
(?i)href="\s*([^\s"]*?)\s*"

使用re.findall可能会在这里工作:

代码语言:javascript
复制
import re

expression = r'(?i)href="\s*([^\s"]*?)\s*"'

string = """
<DT><A HREF="https://cheatsheetseries.owasp.org/cheatsheets/Clickjacking_Defense_Cheat_Sheet.html" ADD_DATE="1567455957">Clickjacking Defense · OWASP Cheat Sheet Series</A>
<DT><A HREF=" https://cheatsheetseries.owasp.org/cheatsheets/Clickjacking_Defense_Cheat_Sheet.html " ADD_DATE="1567455957">Clickjacking Defense · OWASP Cheat Sheet Series</A>
"""

print(re.findall(expression, string))

输出

代码语言:javascript
复制
['https://cheatsheetseries.owasp.org/cheatsheets/Clickjacking_Defense_Cheat_Sheet.html', 'https://cheatsheetseries.owasp.org/cheatsheets/Clickjacking_Defense_Cheat_Sheet.html']

如果您希望探索/简化/修改表达式,那么它已经在regex101.com的右上面板中解释过了。如果您愿意的话,您也可以在这个链接中观察它如何与一些示例输入相匹配。

票数 2
EN

Stack Overflow用户

发布于 2019-09-10 08:09:03

这将起作用:

代码语言:javascript
复制
import re

line = '<DT><A HREF="https://cheatsheetseries.owasp.org/cheatsheets/Clickjacking_Defense_Cheat_Sheet.html" ADD_DATE="1567455957">Clickjacking Defense · OWASP Cheat Sheet Series</A>'

capture_regex = re.compile(r'(?<=HREF=")([^"]*)(?:")',re.IGNORECASE)
# capture_regex = re.compile(r'(?:HREF=")([^"]*)(?:")',re.IGNORECASE) this will work too
print(capture_regex.search(line).groups())
# print(capture_regex.findall(line))  # if your text contains more than one HREF

输出:

代码语言:javascript
复制
  ['https://cheatsheetseries.owasp.org/cheatsheets/Clickjacking_Defense_Cheat_Sheet.html']
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57862700

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档