WaterWestBolus
V2EX  ›  Python

Python3 正则表达式问题

By WaterWestBolus at 2020 年 10 月 2 日 · 3989 次点击

Python3 re 模块的问题

import re
s="![](/img/2020pic/02/1.jpg) 以及: ![](/img/2020pic/02/2.png)"
pattern = re.compile('[(](.+?)(:?.png|.jpg)[)]')
result = pattern.findall(s)
for i in result:
    print(i)

匹配出来的结果如下

('/img/2020pic/02/1', '.jpg')
('/img/2020pic/02/2', '.png')

请问为什么每个匹配项会被分成一个元组,如果想要独立的抓出 /img/2020pic/02/1.jpg 和另一个 png,应该怎么改呢?

16 条回复  •  2020-11-23 04:54:37 +08:00
ysc3839
   1
ysc3839  
   2020 年 10 月 2 日 via Android
最后一句话是什么意思呢?能否举个例子?
WaterWestBolus
   2
WaterWestBolus  
OP
   2020 年 10 月 2 日
@ysc3839 就是说,我想写个正则表达式,从上面那个 s 里面取出```/img/2020pic/02/1.jpg```字段和```/img/2020pic/02/2.png```字段,放在一个 list 里面,预期的 list 应该如下

```
['/img/2020pic/02/1.jpg','/img/2020pic/02/2.png']
```
1462326016
   3
1462326016  
   2020 年 10 月 2 日
也许可以这样?
```
import re

s = "![](/img/2020pic/02/1.jpg) 以及: ![](/img/2020pic/02/2.png)"
pattern = re.compile(r'\((.+?[.png|.jpg])\)')
result = pattern.findall(s)
for i in result:
print(i)
```

排版可能会乱。。。回复好像不支持 markdown
WaterWestBolus
   4
WaterWestBolus  
OP
   2020 年 10 月 2 日
@1462326016
谢谢你的回复,刚刚尝试了你的代码,在 s = ' (( RubberPencil) p).write("Hello");'的情况下居然能匹配到字符串'( RubberPencil) p',非常费解。。
ysc3839
   5
ysc3839  
   2020 年 10 月 2 日 via Android
@WaterWestBolus #2
试试这样?
!\[.*?\]\(.+?\)

https://regex101.com/r/Z0dhS7/1
iNaru
   6
iNaru  
   2020 年 10 月 2 日
(?<=\().+?\.(?:jpg|png)(?=\))
AlisaDestiny
   7
AlisaDestiny  
   2020 年 10 月 2 日
In [2]: p = re.compile(r'\((.+?\.(?:jpg|png))\)')

In [3]: p.findall(s)
Out[3]: ['/img/2020pic/02/1.jpg', '/img/2020pic/02/2.png']
WaterWestBolus
   8
WaterWestBolus  
OP
   2020 年 10 月 2 日
@iNaru 感谢!可用!正则好难看明白。。我研究一下

@ysc3839 这个可以了!但是好像没有把 png jpg 硬编进去?也不是太看的明白。。

@AlisaDestiny 谢谢! 有空去尝试
ysc3839
   9
ysc3839  
   2020 年 10 月 2 日 via Android
@WaterWestBolus #8
看上去你给的例子是 Markdown 中图片的格式,我是按照这个格式的规则来写的,所以没有考虑 png 和 jpg 。
如果要加上
ysc3839
   10
ysc3839  
   2020 年 10 月 2 日 via Android
@ysc3839 (刚才不小心点到回复了)
如果要加上的话
!\[.*?\]\((.+?\.(jpg|png))\)
JCZ2MkKb5S8ZX9pq
   11
JCZ2MkKb5S8ZX9pq  
   2020 年 10 月 2 日
re.compile(r'(?<=\]\().*?\.(?:png|jpg)(?=\))')
我试了下这样可以
brucmao
   12
brucmao  
   2020 年 10 月 3 日
@WaterWestBolus #8 6 楼用了环视,(?<=\().+?\.(?:jpg|png)(?=\))
(?<=\() 匹配前面是(
(?=\)) 匹配后面是)
krixaar
   13
krixaar  
   2020 年 10 月 3 日   ❤️ 1
目的是要一个 list,不一定非得从正则本身下手吧。result = [''.join(i) for i in pattern.findall(s)] 就直接搞定了?
chaogg
   14
chaogg  
   2020 年 10 月 4 日
>>> pattern = re.compile(r'\!\[.*?\]\((.+?\.(?:jpg|png))\)')
>>> pattern.findall(s)
['/img/2020pic/02/1.jpg', '/img/2020pic/02/2.png']
biglazycat
   15
biglazycat  
   2020 年 10 月 24 日
line = "![](/img/2020pic/02/1.jpg) 以及: ![](/img/2020pic/02/2.png)"
pattern = re.compile('\((\S+)\)')
result = pattern.findall(line)
print(result)
biglazycat
   16
biglazycat  
   2020 年 11 月 23 日
>>> s="![](/img/2020pic/02/1.jpg) 以及: ![](/img/2020pic/02/2.png)"
>>> re.findall(r'[/\w]+\/\w+\.\w+', s)
['/img/2020pic/02/1.jpg', '/img/2020pic/02/2.png']
推荐学习书目
› Learn Python the Hard Way
Python Sites
› PyPI - Python Package Index
› http://diveintopython.org/toc/index.html
› Pocoo
值得关注的项目
› PyPy
› Celery
› Jinja2
› Read the Docs
› gevent
› pyenv
› virtualenv
› Stackless Python
› Beautiful Soup
› 结巴中文分词
› Green Unicorn
› Sentry
› Shovel
› Pyflakes
› pytest
Python 编程
› pep8 Checker
Styles
› PEP 8
› Google Python Style Guide
› Code Style from The Hitchhiker's Guide
© 2026 V2EX · 43ms · 3.9.8.5