考慮來(lái)自CFEngine的這段代碼:"test" slist => { "this", "that" },"test2" slist => { "another, "another" },"test3" string => "This one";"test4" slist => { "finally", "this" } 我想要一個(gè) Python 代碼,它將獲取標(biāo)識(shí)符(“test1”、“test2”等)以及{}.我?guī)е@個(gè):re.findall(r'^\s*?\"(.*?)\".*?\{(.*?)\}.*?',filestring,re.MULTILINE | re.DOTALL)哪個(gè)工作正常,除了它最終'finally'.'this'與 匹配"test3",而不是匹配"test4"。我試著用 loosbehind 做一些工作,這樣:re.findall(r'^\s*?\"(.*?)\".*?\{(?!<.*?\".*?)(.*?)\}.*?',filestring,re.MULTILINE | re.DOTALL)希望這(?!<.*?\".*?)會(huì)排除之前有引號(hào)字符的匹配項(xiàng),但它不起作用,我一直得到相同的結(jié)果。有人可以幫助我實(shí)現(xiàn)這一目標(biāo)嗎?我知道我可以做其他測(cè)試,例如測(cè)試下一行是否有slist,但我想避免它,因?yàn)橛袝r(shí)代碼有注釋,如"test4"# some commentslist => { "something"}我確定將標(biāo)識(shí)符與其內(nèi)容匹配的唯一方法是排除具有另一個(gè)不帶{}. 因此,我正在考慮使用該"標(biāo)志來(lái)排除匹配項(xiàng),但它并沒(méi)有像我想象的那樣工作。任何人都可以在這里說(shuō)明一下嗎?
3 回答

慕斯709654
TA貢獻(xiàn)1840條經(jīng)驗(yàn) 獲得超5個(gè)贊
試試這個(gè) ^\s*?\"(.*?)\".*?(?:".*?"|\{(.*?)\})
這將匹配第一組之間的文本,""
然后查找介于""
或之間的內(nèi)容{}
,如果它介于兩者之間則{}
捕獲它。
然后,您需要檢查代碼中是否設(shè)置了第二個(gè)捕獲組。

偶然的你
TA貢獻(xiàn)1841條經(jīng)驗(yàn) 獲得超3個(gè)贊
您可以使用此正則表達(dá)式:
r'(?s)^("[^"]+").*?=> ("[^"]*"|{[^}]*})'
(?s)
:?jiǎn)⒂?DOTALL 修飾符。("[^"]+")
: 匹配并捕獲第一個(gè)帶引號(hào)的字符串("[^"]*"|{[^}]*})
: 匹配第二組可以是帶引號(hào)的字符串或{...}

交互式愛情
TA貢獻(xiàn)1712條經(jīng)驗(yàn) 獲得超3個(gè)贊
在@anubhava 和@JGNI 的幫助下,我明白了:
re.findall(r'(?s)^\s*?\"(.*?)\".*?=> .*?(\".*?\"|\{.*?\})',filestring,re.MULTILINE)
這樣我也能捕捉到我不想要的東西,但很容易丟棄它。
添加回答
舉報(bào)
0/150
提交
取消