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

2020-09-17 06:33:52 +08:00
 billgreen1
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)

先行谢过啦~

1441 次点击
所在节点    正则表达式
2 条回复
Herobs
2020-09-17 08:54:09 +08:00
关键词:断言
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+之外的其他信息。比如我上面的例子,就包含了过滤信息

或者说过滤+提取两步逻辑是必然有中间结果的。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/707738

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX