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

一个正则表达式的小问题

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

    补充

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

    v 站评论真的烦,不知道哪个辣鸡关键词
        13
    ClericPy   45 天前
    @JCZ2MkKb5S8ZX9pq 呃, 其实我那就是个简单的非捕获分组, 没想到性能, 这种简单取值没必要像你那样用零宽断言
        14
    JCZ2MkKb5S8ZX9pq   45 天前
    @ClericPy 嗯,之前没用过这个,搞不明白 group 出来的那几个东西。
    昨天后来学了一下,现在稍微有点概念。感谢。
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   1778 人在线   最高记录 5043   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.3 · 28ms · UTC 01:01 · PVG 09:01 · LAX 17:01 · JFK 20:01
    ♥ Do have faith in what you're doing.