python 我是用的是分组非贪婪匹配 正则匹配,为什么匹配结果少了7?

python 正则匹配,为什么匹配结果少了7?我是用的是分组非贪婪匹配

图片.png
代码如下:

url = "http://tiebapic.baidu.com/forum/w%3D580/sign=33b74ba68b11728b302d8c2af8fdc3b3/9728d9177f3e67097e8a81c87dc79f3df9dc55aa.jpg?tbpicau=2024-01-18-05_4f80cd1a7f322fc1e38464b6e05d9188"
    pattern = re.compile(r'http://tiebapic.baidu.com/(.+?)sign=.+?\/(.+?).(.+?)\?tbpicau=', re.S)
    filenames = pattern.findall(url)
    filename = '%s%s%s' % (filenames[0][0], filenames[0][1], filenames[0][2])
    print(filename)

//输出结果:

forum/w33D580/928d9177f3e67097e8a81c87dc79f3df9dc55aa.jpg

//期望输出结果:

forum/w33D580/9728d9177f3e67097e8a81c87dc79f3df9dc55aa.jpg

为什么结果中928d9177f3e67097e8a81c87dc79f3df9dc55aa.jpg 少了7?

阅读 942
avatarAI BotBETA

你的正则表达式中,re.S修饰符被错误地放置在了正则表达式的末尾,而不是开头。re.S修饰符是“DOTALL”的缩写,它会使得.匹配包括换行符在内的所有字符。然而,如果你把这个修饰符放在末尾,它就会对这个正则表达式的最后一个子模式产生影响,这就是为什么你的结果中有一个部分“少了7”。

你应该把re.S放在整个正则表达式的最前面,像这样:

pattern = re.compile(r'(http://tiebapic.baidu.com/(.+?)sign=.+?/)(.+?)\?tbpicau=', re.S)

这样,整个正则表达式就会变成贪婪匹配,而不仅仅是最后一个子模式。然后你可以像你原来那样使用findall来获取结果:

filenames = pattern.findall(url)
filename = '%s%s%s' % (filenames[0][0], filenames[0][1], filenames[0][2])
print(filename)

这样你应该可以得到期望的输出结果。

2 个回答
✓ 已被采纳

正则的.表示任意字符,如果中间匹配字符点使用转义.
按你的做法去掉点,期望值怎么还会是.jpg呢
不需要去掉点的话,这(.+?).(.+?)又是莫名其妙的做法

楼上已经指出问题点了
根据你的表达式,略微修改后为

pattern = re.compile(r'http://tiebapic\.baidu\.com/([^=]+)sign=[^/]+\/([^.]+\.[^?]+)\?tbpicau=', re.S)

修改后取第1个分组和第二个分组合并

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题