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
pppguest3962
V2EX  ›  Python

Python re 正则匹配,表达式作为条件,但不获取条件内容的问题

  •  
  •   pppguest3962 · 2022-09-23 12:50:32 +08:00 · 2217 次点击
    这是一个创建于 824 天前的主题,其中的信息可能已经有所发展或是发生改变。

    如:

    url = 'www.a888bcd.com/OA/20190913/112233445566.html'
    fileid = re.search(r'\d+\.',url).group(0)
    # 为了防错,实际上不能直接 group(0),search()很有可能是 None 也不一定
    # 啰嗦的一步,认为多余
    # fileid = re.search(r'\d+\.',url).group(0)[:-1]
    

    问题只是锯了个栗子, 请教的问题不是获得这个栗子里的 fileid , 而是 \d+.去匹配 url 要的东西,那么必然最后会带上'.'这个正则匹配条件限定的符号,这个.在最后是是不需要的,还要多写一行去处理[:-1] 问题是: 在正则的书写范畴,是否能写出'.'条件限定匹配,但结果不带上.这个符号的写法? 学习学习,谢谢解答!

    13 条回复    2022-09-25 00:36:28 +08:00
    villivateur
        1
    villivateur  
       2022-09-23 12:53:23 +08:00
    re.search(r'[\d+]\.', url).group(1)
    killva4624
        2
    killva4624  
       2022-09-23 12:53:54 +08:00   ❤️ 1
    hsfzxjy
        3
    hsfzxjy  
       2022-09-23 13:01:49 +08:00 via Android   ❤️ 1
    你需要 后向零宽断言
    ddsfeng
        4
    ddsfeng  
       2022-09-23 13:10:06 +08:00   ❤️ 1
    re.search(r'\d+(?=\.)',url).group(0)
    ddsfeng
        5
    ddsfeng  
       2022-09-23 13:16:24 +08:00
    当然也可以这样:

    re.search(r'(\d+)\.', url).group(1)

    看你个人喜好了.
    TimePPT
        6
    TimePPT  
       2022-09-23 13:21:15 +08:00
    如果仅仅是提取示例中的 112233445566 的话,试试 pathlib ?
    from pathlib import Path

    url = "www.a888bcd.com/OA/20190913/112233445566.html"
    Path(url).stem
    Alias4ck
        7
    Alias4ck  
       2022-09-23 13:24:43 +08:00   ❤️ 1
    应该是 lookahead and lookbehind
    https://regex101.com/r/sKXCB8/1
    ipwx
        8
    ipwx  
       2022-09-23 14:01:26 +08:00
    楼主应该把需求本身说清楚。

    不然又是 XY problem 。
    lookStupiToForce
        9
    lookStupiToForce  
       2022-09-23 14:03:26 +08:00
    5#的分组匹配是最简单的,但 4#的后行断言里英文句号也得加上转义,否则会匹配出来 888

    正则可以在这个网站里快速上手,要不了你 20 分钟
    https://regexlearn.com/
    上手完要实际用了,想不起来可以去 playground 里测试,不是那种 debug de 到死的正则需求也要不了几分钟
    https://regexlearn.com/playground
    hxy100
        10
    hxy100  
       2022-09-23 14:04:14 +08:00
    fileid=re.search(r'.*/([^.]+)\..*?$',url).group(1)
    pppguest3962
        11
    pppguest3962  
    OP
       2022-09-23 17:17:02 +08:00
    学习了,谢谢各位,其实问的是(?=)这种用法,以前从没用过,也没了解过这种用法,匹配又不存储的用法
    ClericPy
        12
    ClericPy  
       2022-09-23 20:17:05 +08:00
    什么鬼就零宽断言都来了... 这问的就是正经分组啊 re.search(r'(\d+)\.',url).group(1)

    甚至连非捕获分组 (?:) 都用不着... 一楼连方括号都来了...
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5928 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 02:31 · PVG 10:31 · LAX 18:31 · JFK 21:31
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.