Python3 正则表达式问题

2020-10-02 18:41:24 +08:00
 WaterWestBolus

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,应该怎么改呢?

2808 次点击
所在节点    Python
16 条回复
ysc3839
2020-10-02 19:07:47 +08:00
最后一句话是什么意思呢?能否举个例子?
WaterWestBolus
2020-10-02 19:10:59 +08:00
@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
2020-10-02 19:21:28 +08:00
也许可以这样?
```
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
2020-10-02 19:29:55 +08:00
@1462326016
谢谢你的回复,刚刚尝试了你的代码,在 s = ' (( RubberPencil) p).write("Hello");'的情况下居然能匹配到字符串'( RubberPencil) p',非常费解。。
ysc3839
2020-10-02 20:32:31 +08:00
@WaterWestBolus #2
试试这样?
!\[.*?\]\(.+?\)

https://regex101.com/r/Z0dhS7/1
iNaru
2020-10-02 20:52:06 +08:00
(?<=\().+?\.(?:jpg|png)(?=\))
AlisaDestiny
2020-10-02 21:38:05 +08:00
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
2020-10-02 22:17:17 +08:00
@iNaru 感谢!可用!正则好难看明白。。我研究一下

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

@AlisaDestiny 谢谢! 有空去尝试
ysc3839
2020-10-02 23:26:42 +08:00
@WaterWestBolus #8
看上去你给的例子是 Markdown 中图片的格式,我是按照这个格式的规则来写的,所以没有考虑 png 和 jpg 。
如果要加上
ysc3839
2020-10-02 23:29:28 +08:00
@ysc3839 (刚才不小心点到回复了)
如果要加上的话
!\[.*?\]\((.+?\.(jpg|png))\)
JCZ2MkKb5S8ZX9pq
2020-10-02 23:55:51 +08:00
re.compile(r'(?<=\]\().*?\.(?:png|jpg)(?=\))')
我试了下这样可以
brucmao
2020-10-03 00:51:44 +08:00
@WaterWestBolus #8 6 楼用了环视,(?<=\().+?\.(?:jpg|png)(?=\))
(?<=\() 匹配前面是(
(?=\)) 匹配后面是)
krixaar
2020-10-03 08:35:38 +08:00
目的是要一个 list,不一定非得从正则本身下手吧。result = [''.join(i) for i in pattern.findall(s)] 就直接搞定了?
chaogg
2020-10-04 20:05:40 +08:00
>>> pattern = re.compile(r'\!\[.*?\]\((.+?\.(?:jpg|png))\)')
>>> pattern.findall(s)
['/img/2020pic/02/1.jpg', '/img/2020pic/02/2.png']
biglazycat
2020-10-24 16:01:09 +08:00
line = "![](/img/2020pic/02/1.jpg) 以及: ![](/img/2020pic/02/2.png)"
pattern = re.compile('\((\S+)\)')
result = pattern.findall(line)
print(result)
biglazycat
2020-11-23 04:54:37 +08:00
>>> 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']

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/712259

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX