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)
先行谢过啦~
1
Herobs 2020-09-17 08:54:09 +08:00 via iPhone
关键词:断言
|
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+之外的其他信息。比如我上面的例子,就包含了过滤信息 或者说过滤+提取两步逻辑是必然有中间结果的。 |