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

请教一个正则表达式,在匹配 pattern1 的条件下,返回所有 pattern2 的字符串

  •  
  •   billgreen1 · 2020-09-17 06:33:52 +08:00 · 1623 次点击
    这是一个创建于 1554 天前的主题,其中的信息可能已经有所发展或是发生改变。
    text1="worda wordb aaaa wordc wordd worde 10, 20 and 35."
    text2="wordf bbbbb wordg wordh 11, 20 and 35."
    text3="wordi 11, 33, 44."
    

    要求是:当且仅当行中出现了 aaaa 这个字符串, 返回所有数字.

    我尝试了以下方法:

    import re
    
    re.findall(r'(?:aaaa).*(\d+)', text1) # ['5']
    re.findall(r'(?:aaaa).*?(\d+)', text1) # ['10']
    # 期待结果是["10", "20", "35"]
    
    # 虽然可以这样,但是我希望能有个一行的正则,而不是匹配 2 次
    if re.findall("aaaa", text1):
        numbers = re.findall("(\d+)", text1)
    

    先行谢过啦~

    Herobs
        1
    Herobs  
       2020-09-17 08:54:09 +08:00 via iPhone
    关键词:断言
    calmzhu
        2
    calmzhu  
       2020-09-17 11:26:30 +08:00
    只想到个可以做到一次匹配提取,但需要自己处理过滤的。
    c = re.findall(r'(aaaa|\d+)','worda wordb aaaa wordc wordd worde 10, 20 and 35.')
    'aaaa' in c and c.remove('aaaa')


    楼主说的找不到,感觉有冲突。就像标题所言,

    必然存在 两步逻辑
    一个是跟据 pattern1 ( p1) 过滤
    一个是跟据 pattern2 ( p2)提取
    并且 p1 p2 是一对多,假设存在 pTrue 可以满足 re.findall(pTrue,text1)可以返回所有楼主所需字符串

    正则模式是连续可变滑动窗口或者窗口组

    要么用一个大滑动窗口 把所有 p1 + p2 全部覆盖

    要么一组窗口分别覆盖 p2 把 p1 拆入每个 p2

    不管哪种,即使使用零款断言的情况下, 窗口中都一定会有有\d+之外的其他信息。比如我上面的例子,就包含了过滤信息

    或者说过滤+提取两步逻辑是必然有中间结果的。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3062 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 00:35 · PVG 08:35 · LAX 16:35 · JFK 19:35
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.