如何使用正则表达式从底部向上搜索?
这是我想要搜索的文本文件的一个例子(文件名为usefile):
DOCK 拟声词
DOCK 啊啊啊
啊啊 DOCK 啊啊
DOCK
啊啊啊啊
拟声词
啊啊啊啊
啊啊啊 DOCK
DOCK 啊啊啊
DOCK 啊啊
我正在使用一个finditer语句来查找所有在DOCK和拟声词之间的内容,代码如下:
re.finditer(r'((dock)(.+?)(onomatopoeia))', usefile, re.I|re.DOTALL)
显然,DOCK这个词比拟声词常见得多,我只想获取在第一个DOCK和拟声词之间的文本。上面的正则表达式会抓取第一个DOCK到拟声词之间的文本,所以我可能会得到“DOCK DOCK DOCK DOCK 拟声词”,而我其实只想要“DOCK 拟声词”。
为了更清楚我的需求,以上内容我想要的是:
1. DOCK 拟声词
2. DOCK 啊啊啊 拟声词
3. DOCK 啊啊 拟声词
有没有办法可以搜索拟声词并向上找到第一个DOCK,或者有没有更好的方法来解决我的问题?
谢谢!
2 个回答
0
这里有一个算法的思路:
- 先设置一个标记,叫做 pushing,初始值为 false(假)。
- 把你的文本分成一个个单词(比如字母的组合),然后逐个处理这些单词。
- 当遇到一个 DOCK 而且 pushing 是 false 的时候,就把它放到一个栈里,并把 pushing 设置为 true(真)。
- 如果遇到 ono... 而且 pushing 是 true 的时候,就把栈里所有的内容打印出来,再加上 ono...,然后清空栈,把 pushing 设置回 false。
- 对于其他单词,如果 pushing 是 true,就把这个单词放到栈里。
- 如果遇到 DOCK 而且 pushing 是 true,就先清空栈,然后把新的 DOCK 放进去。
3
负向前瞻断言可以解决这个问题。
DOCK((?!DOCK).)+?onomatopoeia