一个正则表达式的小问题 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
JCZ2MkKb5S8ZX9pq

一个正则表达式的小问题

  •  
  •   JCZ2MkKb5S8ZX9pq Oct 21, 2019 3490 views
    This topic created in 2386 days ago, the information mentioned may be changed or developed.
    a = 'like/a2bc3d?param' b = 'comment/a2bc3d?param' 
    • 要取出'a2bc3d'
    • re.compile(r'(?<=like/).*?(?=\?)')这种我会写。
    • 但有没有方法同时匹配 like 和 comment ?括号加竖线好像不能放在这个括号里面?
    Supplement 1    Oct 21, 2019

    补充

    • 前缀限定为 like 或 comment,是二选一。
    • 后缀的 param 是不一定的,是变化的。
    • 我希望是一步取出,而不是先得到 like/a2bc3d,然后再切一次。
    jdhao
        1
    jdhao  
       Oct 21, 019 via Android
    capture group? 你这模式都是一致的
    JCZ2MkKb5S8ZX9pq
        2
    JCZ2MkKb5S8ZX9pq  
    OP
       Oct 21, 2019
    @jdhao 请问怎么搞?
    因为实际案例中,后面的 params 是一直在变的,而前缀是限定的几种。
    imn1
        3
    imn1  
       Oct 21, 2019
    ([^/]+/)([^/\?]+)\?.*$
    lululau
        4
    lululau  
       Oct 21, 2019
    '(?<=like/|comment/).*?(?=\?)'
    ClericPy
        5
    ClericPy  
       Oct 21, 2019   1
    虽然你发在 正则 node... 但这种东西为什么要用正则呢...

    a = 'like/a2bc3d?param'
    b = 'comment/a2bc3d?param'
    import os

    print(os.path.split(a))
    print(os.path.split(b))
    # ('like', 'a2bc3d?param')
    # ('comment', 'a2bc3d?param')



    a = 'like/a2bc3d?param'
    b = 'comment/a2bc3d?param'
    import re

    pattern = r'(?:like|comment)/(.*?)\?'
    print(re.search(pattern, a).group(1))
    print(re.search(pattern, b).group(1))
    JCZ2MkKb5S8ZX9pq
        6
    JCZ2MkKb5S8ZX9pq  
    OP
       Oct 21, 2019
    @ClericPy 因为前缀限定,后缀不一定。
    而且请审题,要取出'a2bc3d'。
    你这两种方法,一个带了后缀,一个带上了前缀,并不完美啊。
    JCZ2MkKb5S8ZX9pq
        7
    JCZ2MkKb5S8ZX9pq  
    OP
       Oct 21, 2019
    @lululau python 下会报错唉,不能加那个竖条。
    JCZ2MkKb5S8ZX9pq
        8
    JCZ2MkKb5S8ZX9pq  
    OP
       Oct 21, 2019
    @ClericPy 不好意思,我实验了一下,第二种方法在 python 下是有效的。
    (刚才在 sublime 直接用搜索试,返回的结果不一样。)
    我学习一下,谢谢。
    imn1
        9
    imn1  
       Oct 21, 2019   1
    我写的你为何不看呢?

    In [4]: import re

    In [5]: a = 'like/a2bc3d?param'

    In [6]: r = r'([^/]+/)([^/\?]+)\?.*$'

    In [7]: re.findall(r,a)
    Out[7]: [('like/', 'a2bc3d')]

    In [8]: b = 'comment/a2bc3d?param'

    In [9]: re.findall(r,b)
    Out[9]: [('comment/', 'a2bc3d')]
    JCZ2MkKb5S8ZX9pq
        10
    JCZ2MkKb5S8ZX9pq  
    OP
       Oct 22, 2019
    @imn1 我在题目下 append 了一下,因为要指定特定的前缀,一开始没讲明白。
    JCZ2MkKb5S8ZX9pq
        11
    JCZ2MkKb5S8ZX9pq  
    OP
       Oct 22, 2019
    另外我试了一下速度,@ClericPy 的方法满快的。

    ```
    text = 'http://abc.com/liked/a2bc3d?param\nhttp://abc.com/comment/a2bc3d?param'

    start = time.time()
    pt1 = re.compile(r'(?:like|comment)/(.*?)\?')
    for i in range(100000):
    r = pt1.search(text).group(1)
    print(f'pt1: {time.time()-start}')

    start = time.time()
    pt2 = re.compile(r'([^/]+/)([^/\?]+)\?.*$')
    for i in range(100000):
    r = pt2.search(text).group(2)
    print(f'pt2: {time.time()-start}')
    ```

    结果
    pt1: 0.20356273651123047
    pt2: 1.4281411170959473
    itechify
        12
    itechify  
    PRO
       Oct 22, 2019 via Android
    https://imgchr.com/i/K1jiZR

    v 站评论真的烦,不知道哪个辣鸡关键词
    ClericPy
        13
    ClericPy  
       Oct 22, 2019
    @JCZ2MkKb5S8ZX9pq 呃, 其实我那就是个简单的非捕获分组, 没想到性能, 这种简单取值没必要像你那样用零宽断言
    About     Help     Advertise     Blog     API     FAQ     Solana     2436 Online   Highest 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 48ms UTC 07:07 PVG 15:07 LAX 00:07 JFK 03:07
    Do have faith in what you're doing.
    ubaomsnsnddmindexpchomeyahoorakutenmypapermeadowduckbidyahooyoubaozxmzxmasdabnvcgcvbfgdfscvmmhjkxxddcyybgbzznbnccubaouaituacvGXCVETGDGYHFGBCVBFJFHCBRECBCGDGET54WRWRRWERWREWWRWERRWERSDGEWSFDSFSFfbbsubaofhddfgewrdgdfewwrewwretruyutututdfgfgdgdfgtetgdfgtdfgdert4gdfggwr235wer3wevsdfsdfgdfertxcvsdfrwerhfddfgcvbrwfafbdfhjghbmnlghrtygfdscxvxcvxcsvdasfdffgdcvsdftertsdfsdfsdfsdfsdfsdfsdfsdfsdfsdfsdfsdfsdfsdfsdfsdfsdfsdfsdfsdfsdfsdfsdfsdfsdfsdfsdfsdfsdfsdfsdfsdfsdfsdfsdfsdfsdfsdfsdfsdfshasha9178shasha9178shasha9178shasha9178shasha9178liflif2liflif2liflif2liflif2liflif2liblib3liblib3liblib3liblib3liblib3zhazha444zhazha444zhazha444zhazha444zhazha444dende5dendedendendenden2denden21fenfen9fenf619fen619fenfe9fe619sdfsdfsdfsdfsdfzhazh90zhazh0zhaa50zha90zh590zhozhozzhozhzhozhozhozho2lislislls95lili95lils5liss9sdf0ty987sdft876sdft9876sdf09876sd0t9876sdf0ty98sdf0976sdf0ty986sdf0ty96sdf0t76sdf0876df0ty98sf0t876sd0ty76sdy76sdf76sdf0t76sdf0ty9sdf0ty98sdf0ty987sdf0ty98sdf6676sdf876sd876sd876sdf6sdf6sdf9876sdf0tsdf06sdf0ty9776sdf0ty9776sdf0ty76sdf8876sdf0tsd6sdf06s688876sd688sdf86
    JCZ2MkKb5S8ZX9pq
        14
    JCZ2MkKb5S8ZX9pq  
    OP
       Oct 22, 2019
    @ClericPy 嗯,之前没用过这个,搞不明白 group 出来的那几个东西。
    昨天后来学了一下,现在稍微有点概念。感谢。