我在 .txt 檔案中有一段文本,內容如下:
調查結果概覽
--datatext1
調查結果概覽
--datatext2
調查結果概覽
--datatext3
調查結果摘要
調查結果概述可以隨機發生多次,也可以只發生一次。我只對 datatext3(可變數量的文本)感興趣。也就是說,僅位于最后一次出現的“OVERVIEW OF FINDINGS”和“SUMMARY OF FINDINGS”之間的文本。
有一些關于如何使用re以及如何拆分字串以獲得正確文本的帖子。從他們那里,我能夠找到一個適用于下面的解決方案。但是,它有多個 for 回圈和一個 if/elif 附加回圈。這似乎非常復雜,我想知道我是否忽略了一個更簡單的解決方案?
#Index all occurrences of OVERVIEW OF FINDINGS and SUMMARY OF FINDINGS:
x = []
y = []
for i in re.finditer('OVERVIEW OF FINDINGS', data):
x.append(i.start())
for j in re.finditer('SUMMARY OF FINDINGS', data):
y.append(j.start())
#Append to overview only when the next overview index is after the next summary index
n = 0
overview = []
for m in range(0,len(x)):
if x[m] == x[-1]: #condition for last value in x or if only one value in x
overview.append(data[x[m] 21:y[n]]) #(Note: OVERVIEW OF FINDINGS = 21)
elif x[m 1] > y[n]:
overview.append(data[x[m] 21:y[n]])
if y[-1] == y[n]:
break
else:
n = 1
uj5u.com熱心網友回復:
這里不需要正則運算式;只需在您要查找的子字串上拆分字串。
start = 'OVERVIEW OF FINDINGS'
end = 'SUMMARY OF FINDINGS'
result = text.split(start)[-1].split(end)[0].strip()
uj5u.com熱心網友回復:
如果您愿意使用正則運算式,我們可以re.findall在這里使用:
inp = """OVERVIEW OF FINDINGS
--datatext1
OVERVIEW OF FINDINGS
--datatext2
OVERVIEW OF FINDINGS
--datatext3
SUMMARY OF FINDINGS"""
text = re.findall(r'\bOVERVIEW OF FINDINGS\b(?!.*\bOVERVIEW OF FINDINGS\b)\s*(\S )\s SUMMARY OF FINDINGS', inp, flags=re.S)[0]
print(text) # --datatext3
正則運算式模式使用否定前瞻來斷言OVERVIEW OF FINDINGS唯一匹配的是整個文本中的最后一個。以下是正則運算式模式的解釋:
\bOVERVIEW OF FINDINGS\b match 'OVERVIEW...'
(?!.*\bOVERVIEW OF FINDINGS\b) assert that no more 'OVERVIEW...' occurs
\s* optional whitespace
(\S ) match content
\s match whitespace
SUMMARY OF FINDINGS match 'SUMMARY...'
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/401075.html
上一篇:從正則運算式組中排除一些字符
