python - 找到所有用双引号括起来的子字符串,满足python正则表达式中的一些约束

标签 python regex

我想找到所有用双引号括起来的子字符串,满足以下两个约束:

  1. “http”开头的最短子字符串
  2. “.bmp”或“.jpg”结尾

我的代码如下:

import re
pat = '"(http.+?\.(jpg|bmp))"'  # I don't how to modify this pattern
reg = re.compile(pat)
aa = '"http:afd/aa.bmp" :tt: "kkkk"  ++, "http--test--http:kk/bb.jpg"'
print reg.findall(aa)

我的预期输出是

['http:afd/aa.bmp', 'http:kk/bb.jpg']

但是执行结果是

[('http:afd/aa.bmp', 'bmp'), ('http--test--http:kk/bb.jpg', 'jpg')]

我已经尝试了几种模式,但仍然无法得到我想要的。

我应该如何修改我的代码以获得我期望的结果?谢谢!

最佳答案

在第一个 " 之后使用 [^"]* 否定字符类以保留在双引号子字符串内(注意 - 这仅在没有转义序列的情况下才有效)并到达最后一个 http,然后将其也添加到末尾,以到达尾随的 "

import re
pat = r'"[^"]*(http.*?\.(?:jpg|bmp))[^"]*"'
reg = re.compile(pat)
aa = '"http:afd/aa.bmp" :tt: "kkkk"  ++, "http--test--http:kk/bb.jpg"'
print reg.findall(aa)
# => ['http:afd/aa.bmp', 'http:kk/bb.jpg']

请参阅Python demo online .

图案详细信息:

  • " - 文字双引号
  • [^"]* - 除双引号之外的 0+ 个字符,尽可能多,因为 *贪婪量词
  • (http.*?\.(?:jpg|bmp)) - 第 1 组(使用 re.findall 提取)匹配:
    • http - 文字子字符串 http
    • .*? - 任何 0+ 个字符,尽可能少(因为 *? 是一个惰性> 量词)
    • \. - 文字点
    • (?:jpg|bmp) - 匹配任一 的非捕获组(因此它匹配的文本无法使用 re.findall 输出) >jpgbmp 子字符串
  • [^"]* - 除双引号外的 0+ 个字符,尽可能多
  • " - 文字双引号

关于python - 找到所有用双引号括起来的子字符串,满足python正则表达式中的一些约束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43798675/

相关文章:

javascript - 将所有单词大写

java - 正则表达式 "either a semicolon or the end of the string"

r - 使用 R 中的 stringi 提取字符串中某些字符之后的多个子字符串

mysql - 从 mysql 中的字符串中获取哈希标签

python - 在python中提取指定字符之间的字符串

python - 在 Python 中使用 geopy 进行地理编码时出现错误 (429) 请求过多

python - 如何更改字典的键?

python - opencv 特征与空公式模板匹配

python - matplotlib 图从 QT 抛出 TypeError

Python字典在字典中切换键