V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
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
WaterWestBolus
V2EX  ›  Python

Python3 正则表达式问题

  •  
  •   WaterWestBolus · 2020-10-02 18:41:24 +08:00 · 2809 次点击
    这是一个创建于 1515 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

    @AlisaDestiny 谢谢! 有空去尝试
    ysc3839
        9
    ysc3839  
       2020-10-02 23:26:42 +08:00 via Android
    @WaterWestBolus #8
    看上去你给的例子是 Markdown 中图片的格式,我是按照这个格式的规则来写的,所以没有考虑 png 和 jpg 。
    如果要加上
    ysc3839
        10
    ysc3839  
       2020-10-02 23:29:28 +08:00 via Android
    @ysc3839 (刚才不小心点到回复了)
    如果要加上的话
    !\[.*?\]\((.+?\.(jpg|png))\)
    JCZ2MkKb5S8ZX9pq
        11
    JCZ2MkKb5S8ZX9pq  
       2020-10-02 23:55:51 +08:00
    re.compile(r'(?<=\]\().*?\.(?:png|jpg)(?=\))')
    我试了下这样可以
    brucmao
        12
    brucmao  
       2020-10-03 00:51:44 +08:00
    @WaterWestBolus #8 6 楼用了环视,(?<=\().+?\.(?:jpg|png)(?=\))
    (?<=\() 匹配前面是(
    (?=\)) 匹配后面是)
    krixaar
        13
    krixaar  
       2020-10-03 08:35:38 +08:00   ❤️ 1
    目的是要一个 list,不一定非得从正则本身下手吧。result = [''.join(i) for i in pattern.findall(s)] 就直接搞定了?
    chaogg
        14
    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
        15
    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
        16
    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']
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5969 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 31ms · UTC 01:50 · PVG 09:50 · LAX 17:50 · JFK 20:50
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.