4 回答

TA貢獻1998條經(jīng)驗 獲得超6個贊
這似乎有效。它不像@ArtyomVancyan 的回答那么簡單或優(yōu)雅,盡管它有一點優(yōu)勢,即它不需要在表達式末尾換行:
(?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)+?(?:\]|^$)
:兩個連續(xù)的非捕獲子組;第一個是一堆線,(?:.*|n)+
,非貪婪的,?
; 第二個是右方括號]
, 或空行^$
. 也就是說,一堆行以包含右方括號或空行的第一行結(jié)尾。

TA貢獻1851條經(jīng)驗 獲得超4個贊
您可以使用一種模式來重復標題部分下行的可能格式。
這些行以單詞字符開頭,后跟=
一部分"..."
或[...]
\[\[title]]((?:\r?\n\w+\s*=\s*(?:"[^"]*"|\[[^\]\[]*]))*)
解釋
\[\[title]]
比賽[[title]]
(
捕獲組 1\r?\n
匹配一個換行符\w+\s*=\s*
匹配 1+ 個單詞字符和=
可選的空白字符之間(?:
備選方案的非捕獲組)
關(guān)閉非捕獲組"[^"]*"
匹配來自"..."
|
要么\[[^\]\[]*]
匹配從[
...]
(?:
非捕獲組)*
關(guān)閉非捕獲組并可選擇重復)
關(guān)閉第 1 組

TA貢獻1825條經(jīng)驗 獲得超6個贊
與其制作一個看起來充滿危險的正則表達式,不如為你的自定義格式構(gòu)建一個自定義解析器可能會更好,或者你可能會發(fā)現(xiàn)你可以重新利用INI configparser的實現(xiàn)
如果標題總是被定義為在塊的對內(nèi)[[]] 和塊的開頭,您可以使用正則表達式來查找它們,但只能將它們分開
如果您對內(nèi)容不感興趣(當然下一步就是您)并且您確定結(jié)構(gòu)如您所展示的那樣簡單,您也可以直接在這些內(nèi)容上拆分兩次
>>> 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",
]
- 4 回答
- 0 關(guān)注
- 143 瀏覽
添加回答
舉報