我嘗試使用正則運算式從復雜的字串中提取資訊。我嘗試將第{一個和最后一個}中的內容提取為內容。不幸的是,我與嵌套的{}. 如何處理這個問題?
我認為關鍵是平衡{}所有正則運算式,到目前為止我還沒有成功......請參閱下面的括號示例:
正則運算式匹配平衡括號
import re
my_string = """
extend mineral Uraninite {
kinetics {
rate = -3.2e-08 mol/m2/s
area = Uraninite
y-term, species = Uraninite
w-term {
species = H[ ]
power = 0.37
}
}
kinetics {
rate = 3.2e-09 mol/m2/s
area = Uraninite
y-term, species = Uraninite
w-term {
species = H[ ]
power = 0.37
}
}
}
"""
regex = re.compile(
r"extend\s "
r"(?:(?P<phase>colloid|mineral|basis|isotope|solid-solution)\s )?"
r"(?P<species>[^\n ] )\s "
r"{(?P<content>[^}]*)}\n\s }")
extend_list = [m.groupdict() for m in regex.finditer(my_string)]
到目前為止,我得到了:
print(extended_list["content"])
"""
kinetics {
rate = -3.2e-08 mol/m2/s
area = Uraninite
y-term, species = Uraninite
w-term {
species = H[ ]
power = 0.37
"""
看來,我需要使用regex包regex,因為re不支持遞回。確實,這似乎有效:
import regex as re
pattern = re.compile(r"{(?P<content>((?:[^{}]|(?R))*))}")
extend_list2 = [m.groupdict() for m in pattern.finditer(read_data)]
print(extended_list2["content"])
"""
kinetics {
rate = -3.2e-08 mol/m2/s
area = Uraninite
y-term, species = Uraninite
w-term {
species = H[ ]
power = 0.37
}
}
kinetics {
rate = 3.2e-09 mol/m2/s
area = Uraninite
y-term, species = Uraninite
w-term {
species = H[ ]
power = 0.37
}
}
"""
但是將它插入到主模式中是行不通的。
pattern = re.compile(
r"extend\s ([^n]*)"
r"(?:(?P<phase>colloid|mineral|basis|isotope|solid-solution)\s )?"
r"(?P<species>[^\n ] )\s "
r"{(?P<content>((?:[^{}]|(?R))*))\}")
extend_list = [m.groupdict() for m in pattern.finditer(read_data)]
uj5u.com熱心網友回復:
我相信當前的正則運算式可以寫成
rx = r"extend\s (.*)(?:(?P<phase>colloid|mineral|basis|isotope|solid-solution)\s )?(?P<species>\S )\s ({(?P<content>((?:[^{}] |(?4))*))})"
將(?R)變為一個正則運算式子程式({(?P<content>((?:[^{}] |(?4))*))})。組 ID 是組 4,因此子程式宣告是(?4)。您可以在此處快速測驗。
該[^n]*像一個錯字的外觀,它匹配零個或多個非n字符。我使用.*, 匹配盡可能多的除換行符以外的零個或多個字符。
該[^\n ]像一個嘗試匹配非空白塊的樣子,所以我建議\S在這里。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/361180.html
上一篇:忽略在重復組中捕獲的領先空間?
下一篇:來自文本檔案的Python資料框
