V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
JCZ2MkKb5S8ZX9pq
V2EX  ›  正则表达式

一个正则表达式的小问题

  •  
  •   JCZ2MkKb5S8ZX9pq · 2019-10-21 21:16:27 +08:00 · 2903 次点击
    这是一个创建于 1862 天前的主题,其中的信息可能已经有所发展或是发生改变。
    a = 'like/a2bc3d?param'
    b = 'comment/a2bc3d?param'
    
    • 要取出'a2bc3d'
    • re.compile(r'(?<=like/).*?(?=\?)')这种我会写。
    • 但有没有方法同时匹配 like 和 comment ?括号加竖线好像不能放在这个括号里面?
    第 1 条附言  ·  2019-10-21 23:46:32 +08:00

    补充

    • 前缀限定为 like 或 comment,是二选一。
    • 后缀的 param 是不一定的,是变化的。
    • 我希望是一步取出,而不是先得到 like/a2bc3d,然后再切一次。
    jdhao
        1
    jdhao  
       2019-10-21 21:21:36 +08:00 via Android
    capture group? 你这模式都是一致的
    JCZ2MkKb5S8ZX9pq
        2
    JCZ2MkKb5S8ZX9pq  
    OP
       2019-10-21 21:56:34 +08:00
    @jdhao 请问怎么搞?
    因为实际案例中,后面的 params 是一直在变的,而前缀是限定的几种。
    imn1
        3
    imn1  
       2019-10-21 22:04:52 +08:00
    ([^/]+/)([^/\?]+)\?.*$
    lululau
        4
    lululau  
       2019-10-21 22:07:16 +08:00
    '(?<=like/|comment/).*?(?=\?)'
    ClericPy
        5
    ClericPy  
       2019-10-21 22:18:10 +08:00   ❤️ 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
       2019-10-21 23:44:16 +08:00
    @ClericPy 因为前缀限定,后缀不一定。
    而且请审题,要取出'a2bc3d'。
    你这两种方法,一个带了后缀,一个带上了前缀,并不完美啊。
    JCZ2MkKb5S8ZX9pq
        7
    JCZ2MkKb5S8ZX9pq  
    OP
       2019-10-21 23:50:00 +08:00
    @lululau python 下会报错唉,不能加那个竖条。
    JCZ2MkKb5S8ZX9pq
        8
    JCZ2MkKb5S8ZX9pq  
    OP
       2019-10-21 23:52:52 +08:00
    @ClericPy 不好意思,我实验了一下,第二种方法在 python 下是有效的。
    (刚才在 sublime 直接用搜索试,返回的结果不一样。)
    我学习一下,谢谢。
    imn1
        9
    imn1  
       2019-10-21 23:59:24 +08:00   ❤️ 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
       2019-10-22 00:10:42 +08:00
    @imn1 我在题目下 append 了一下,因为要指定特定的前缀,一开始没讲明白。
    JCZ2MkKb5S8ZX9pq
        11
    JCZ2MkKb5S8ZX9pq  
    OP
       2019-10-22 00:18:42 +08:00
    另外我试了一下速度,@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
    oneisall8955
        12
    oneisall8955  
       2019-10-22 00:46:23 +08:00 via Android
    https://imgchr.com/i/K1jiZR

    v 站评论真的烦,不知道哪个辣鸡关键词
    ClericPy
        13
    ClericPy  
       2019-10-22 09:56:42 +08:00
    @JCZ2MkKb5S8ZX9pq 呃, 其实我那就是个简单的非捕获分组, 没想到性能, 这种简单取值没必要像你那样用零宽断言
    JCZ2MkKb5S8ZX9pq
        14
    JCZ2MkKb5S8ZX9pq  
    OP
       2019-10-22 12:16:42 +08:00
    @ClericPy 嗯,之前没用过这个,搞不明白 group 出来的那几个东西。
    昨天后来学了一下,现在稍微有点概念。感谢。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5459 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 06:54 · PVG 14:54 · LAX 22:54 · JFK 01:54
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.