JCZ2MkKb5S8ZX9pq

一个正则表达式的小问题

  •  
  •   JCZ2MkKb5S8ZX9pq · Oct 21, 2019 · 4053 views
    This topic created in 2569 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
    jdhao
    Oct 21, 2019 via Android
    1
    capture group? 你这模式都是一致的
    JCZ2MkKb5S8ZX9pq
    JCZ2MkKb5S8ZX9pq
    OP
    Oct 21, 2019
    2
    @jdhao 请问怎么搞?
    因为实际案例中,后面的 params 是一直在变的,而前缀是限定的几种。
    imn1
    imn1
    Oct 21, 2019
    3
    ([^/]+/)([^/\?]+)\?.*$
    lululau
    lululau
    Oct 21, 2019
    4
    '(?<=like/|comment/).*?(?=\?)'
    ClericPy
    ClericPy
    Oct 21, 2019❤️1
    5
    虽然你发在 正则 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
    JCZ2MkKb5S8ZX9pq
    OP
    Oct 21, 2019
    6
    @ClericPy 因为前缀限定,后缀不一定。
    而且请审题,要取出'a2bc3d'。
    你这两种方法,一个带了后缀,一个带上了前缀,并不完美啊。
    JCZ2MkKb5S8ZX9pq
    JCZ2MkKb5S8ZX9pq
    OP
    Oct 21, 2019
    7
    @lululau python 下会报错唉,不能加那个竖条。
    JCZ2MkKb5S8ZX9pq
    JCZ2MkKb5S8ZX9pq
    OP
    Oct 21, 2019
    8
    @ClericPy 不好意思,我实验了一下,第二种方法在 python 下是有效的。
    (刚才在 sublime 直接用搜索试,返回的结果不一样。)
    我学习一下,谢谢。
    imn1
    imn1
    Oct 21, 2019❤️1
    9
    我写的你为何不看呢?

    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
    JCZ2MkKb5S8ZX9pq
    OP
    Oct 22, 2019
    10
    @imn1 我在题目下 append 了一下,因为要指定特定的前缀,一开始没讲明白。
    JCZ2MkKb5S8ZX9pq
    JCZ2MkKb5S8ZX9pq
    OP
    Oct 22, 2019
    11
    另外我试了一下速度,@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
    itechify
    Oct 22, 2019 via Android
    12
    https://imgchr.com/i/K1jiZR

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