我想找到所有用双引号括起来的子字符串,满足以下两个约束:
- 以“http”开头的最短子字符串
- 以“.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/