我有一個長字串是這樣構建的:
[[title]]
a = "1"
b = "1"
c = "1"
d = "1"
e = [
"1",
"1",
]
[[title]]
a = "2"
b = "2"
c = "2"
d = "2"
e = [
"2",
]
[[title]]
a = "a3"
b = "3"
c = "3"
[[title]]
a = "a4"
b = "4"
c = "4"
e = [
"4",
]
我的目標是提取每個標題內的文本(沒有標題)并將其放入切片中。我嘗試使用屬性鍵(如 d 和 e),但有時它們不存在。
您可以在下面查看我的正則運算式:
(?m)(((\[\[title]]\s*\n)(?:^. $\n) ?)(d.*?$)(\s*e(.|\n)*?])?)
我想找到一種方法來提取每個標題之間的資料,直到 \n 或字串結尾
版:
我正在使用 GO,所以我不能在語法后面使用環顧四周
謝謝!
uj5u.com熱心網友回復:
您可以使用以下匹配 from[[title]]到空行的模式。
`\[\[title]](.*?)^$`gms
解釋
\[\[title]]匹配[[title]](捕獲組.*?直到下一場比賽的非貪婪比賽
)關閉組^$使用m(多行)標志這意味著一個空行
使用Golang正則運算式引擎查看演示
uj5u.com熱心網友回復:
這似乎有效。它不像@ArtyomVancyan 的回答那樣簡單或優雅,盡管它有一點優勢,即在運算式末尾不需要換行符:
[演示]
(?m)(?:\[\[title]]\n((?:.*\n) ?(?:\]|^$)))
解釋:
(?m): 多行修飾符。(?:\[\[title]]\n(<text until next closing square bracket or blank line>)):找到一個或多個以 開頭[[title]]\n和后面的塊<text until next closing square bracket or blank line>,并捕獲這些文本。(?:.*\n) ?(?:\]|^$):兩個連續的非捕獲子組;第一個是一堆線,(?:.*|n),非貪婪,?; 第二個是右方括號],或空行,^$。也就是說,一堆行以包含右方括號的第一行或空行結束。
uj5u.com熱心網友回復:
與其制作一個看起來充滿危險的正則運算式,不如為您的自定義格式構建一個自定義決議器,或者您可能會發現您可以重新利用INI 配置決議器的實作
如果標題總是被定義為在塊的對內[[]] 和開始處,您可以使用正則運算式來查找它們,但只能將它們分開
如果你對內容不感興趣(下一步肯定是你)并且你確定結構和你展示的一樣簡單,你也可以直接在這些上拆分兩次
>>> long_string_config = """ """ # input data omitted for brevity
>>> for block in filter(None, (a.split("]]")[-1].strip() for a in long_string_config.split("[["))):
... print("---")
... print(block)
...
---
a = "1"
b = "1"
c = "1"
d = "1"
e = [
"1",
"1",
]
---
a = "2"
b = "2"
c = "2"
d = "2"
e = [
"2",
]
---
a = "a3"
b = "3"
c = "3"
---
a = "a4"
b = "4"
c = "4"
e = [
"4",
]
uj5u.com熱心網友回復:
您可以使用模式來重復標題部分下的行的可能格式。
這些行以單詞字符開頭=,然后是一個部分"..."或[...]
\[\[title]]((?:\r?\n\w \s*=\s*(?:"[^"]*"|\[[^\]\[]*]))*)
解釋
\[\[title]]匹配[[title]](捕獲組 1(?:非捕獲組\r?\n匹配換行符\w \s*=\s*匹配 1 個單詞字符和=可選的 whitspace 字符之間(?:替代品的非捕獲組"[^"]*"匹配自"..."|或者\[[^\]\[]*][從...匹配]
)關閉非捕獲組
)*關閉非捕獲組并可選擇重復
)關閉組 1
正則運算式演示
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/487830.html
