【问题标题】:Greedy regex lookbehind [duplicate]贪婪的正则表达式向后看[重复]
【发布时间】:2020-01-11 17:36:18
【问题描述】:

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

  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"。如何编写不包含最后一个引号的正则表达式。

回答了我的问题。我补充说我在我的正则表达式中添加了所谓的非贪婪。 capture_regex = re.compile(r'(?&lt;=HREF=").*?(?=")',re.IGNORECASE)。通过在* 之后添加? 使其仅在第一个" 处停止。

【问题讨论】:

  • 使用前瞻(?=") 而不仅仅是"
  • 您应该避免使用正则表达式来解析 HTML 文件。应该改用bs4
  • (?=") 查找最后一个 "bs4 会起作用,我正在努力提高我的正则表达式技能。

标签: python regex


【解决方案1】:
capture_regex = re.compile(r'(?<=HREF=").*?(?=")',re.IGNORECASE)

working fiddle

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

【讨论】:

  • 这捕获了比需要更多的数据。 https://cheatsheetseries.owasp.org/cheatsheets/Clickjacking_Defense_Cheat_Sheet.html" ADD_DATE="1567455957
  • @newdeveloper:我多么愚蠢地错过了这一点。现在已更正...
  • 是的,我明白了,谢谢。
【解决方案2】:

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

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'])

输出

https://cheatsheetseries.owasp.org/cheatsheets/Clickjacking_Defense_Cheat_Sheet.html

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

的表达
(?i)href="\s*([^\s"]*?)\s*"

re.findall 可能在这里工作:

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))

输出

['https://cheatsheetseries.owasp.org/cheatsheets/Clickjacking_Defense_Cheat_Sheet.html', 'https://cheatsheetseries.owasp.org/cheatsheets/Clickjacking_Defense_Cheat_Sheet.html']

如果您想探索/简化/修改表达式,它已经 在右上角的面板上进行了解释 regex101.com。如果你愿意,你 也可以在this link看,怎么搭配 针对一些样本输入。


【讨论】:

    【解决方案3】:

    这将起作用:

    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
    

    输出:

      ['https://cheatsheetseries.owasp.org/cheatsheets/Clickjacking_Defense_Cheat_Sheet.html']
    

    【讨论】:

      猜你喜欢
      • 2023-02-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多