在這個例子中,我想選擇所有單詞,除了引號之間的單詞(即“results”、“items”、“packages”、“settings”和“build_type”,而不是“compiler.version”)。
results[0].items[0].packages[0].settings["compiler.version"]
results[0].items[0].packages[0].settings.build_type
這是我所知道的:我可以定位所有單詞
[a-z_]
然后用這個定位引號之間的內容:
(?<=\")[\w.] (?=\")
有沒有辦法匹配第一個和第二個正則運算式的結果之間的差異?(即單詞,除非它們被雙引號包圍)
為方便起見,這是一個帶有示例的正則運算式游樂場
uj5u.com熱心網友回復:
您可以匹配雙引號之間的字串,然后匹配和捕獲單詞,可選擇后跟點分隔的單詞:
list(filter(None, re.findall(r'"[^"]*"|([a-z_]\w*(?:\.[a-z_]\w*)*)', text, re.ASCII | re.I)))
請參閱正則運算式演示。詳情:
"[^"]*"- 一個"字符,零個或多個字符",然后是一個"字符|- 或者([a-z_]\w*(?:\.[a-z_]\w*)*)- 第 1 組:字母或下劃線后跟零個或多個單詞字符,然后是零個或多個 a 序列,.然后是字母或下劃線,后跟零個或多個單詞字符。
請參閱Python 演示:
import re
text = 'results[0].items[0].packages[0].settings["compiler.version"] '
print(list(filter(None, re.findall(r'"[^"]*"|([a-z_]\w*(?:\.[a-z_]\w*)*)', text, re.ASCII | re.I))))
# => ['results', 'items', 'packages', 'settings']
該re.ASCII選項用于在不考慮 Unicode 字符的情況下進行\w匹配[a-zA-Z0-9_]。
uj5u.com熱心網友回復:
我相信這是您正在尋找的解決方案的更干凈/更簡單的版本:
(?<!\")\b[a-z_] \b(?!\")
這是一個演示
請讓我知道這是否有幫助/這是否是您想要的!
uj5u.com熱心網友回復:
當且僅當一個單詞在字串中跟隨著偶數個雙引號(假設字串格式正確,因此包含偶數個雙引號)時,它才不在雙引號子字串中。您可以使用以下正則運算式來匹配未包含在雙引號子字串中的字串。
[a-z_] (?=(?:(?:[^\"\n]*\"){2})*[^\"\n]*\n)
演示
正則運算式可以分解如下(或者,將游標懸停在鏈接處運算式的每個部分上以獲得對其功能的解釋)。
[a-z_] # match one or more of the indicated characters
(?= # begin a positive lookahead
(?: # begin an outer non-capture group
(?: # begin an inner non-capture group
[^\"\n]* # match zero or more characters other than " and \n
\" # match "
){2} # end inner non-capture group and execute twice
)* # end outer non-capture group and execute zero or more times
[^\"\n]* # match zero or more characters other than " and \n
\n # match a newline
) # end positive lookahead
\n(?:\n|$)如果最后一行可能沒有行終止符,則應替換為。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/351509.html
上一篇:洗掉重復項保留最后一次出現
下一篇:VisualStudioSnippet:我可以使用TM_FILENAME從RELATIVE_FILEPATH獲取命名空間嗎?
