我想在特定模式 egxset(, 到最后一個對應的括號到第一個括號之后的特定模式 egxset(, 甚至在行之間搜索( 在找到相應的結束括號之前獲得盡可能多的文本) 之后獲取整個字串。示??例字串:
"ver = '1.0'
if x.set('1.2'):
p = x.set('python_version', None)
x = x.set('test_template', DEFAULT, p(x,b),
z())"
我搜索的結果應該是(使用 re.findall):
find_all_res = [['1.2'],['python_version', None],['test_template', DEFAULT, p(x,b),\nz()]
現在我正在使用:
re.findall(pattern="(?<![0-9a-zA-Z_])x.set([\s\S] ?)(?<=[)])(\s)", string=value)
結果我有:
find_all_res = [[("('1.2'):\n p = x.set('python_version')", '\n'), ("('test_template', DEFAULT, p(x,b),\n z())", '\n')]
uj5u.com熱心網友回復:
您可以pip install regex安裝 PyPiregex庫并使用
\bx\.set\((?:\s*(?:,\s*)?(?<o>[- ]?\d*\.?\d (?:[Ee][- ]?\d )?|\w (?<a>\((?:[^()] |(?&a))*\))*|'[^'\\]*(?:\\.[^'\\]*)*'|"[^"\\]*(?:\\.[^"\\]*)*"))*\s*\)
看到正則運算式的作用。詳情:
\b- 一個詞邊界x\.set\(-x.set(字串(?:\s*(?:,\s*)?(?<o>[- ]?\d*\.?\d (?:[Ee][- ]?\d )?|\w (?<a>\((?:[^()] |(?&a))*\))*|'[^'\\]*(?:\\.[^'\\]*)*'|"[^"\\]*(?:\\.[^"\\]*)*"))*- 零次或多次出現:\s*(?:,\s*)?- 零個或多個空格,然后可選出現,零個或多個空格(?<o>- 組“o”(它將包含您需要的所有字串):[- ]?\d*\.?\d (?:[Ee][- ]?\d )?|-數字模式,或\w (?<a>\((?:[^()] |(?&a))*\))*- 一個或多個單詞字符,然后是零個或多個(...)帶有任意數量嵌套括號的子字串,或'[^'\\]*(?:\\.[^'\\]*)*'|- 帶有轉義序列支持的單引號字串文字,或"[^"\\]*(?:\\.[^"\\]*)*"- 帶有轉義序列支持的雙引號字串文字
)- 小組結束
\s*- 零個或多個空格\)- 一個)字符。
看一個Python 演示:
import regex
text = r"""ver = '1.0'
if x.set('1.2'):
p = x.set('python_version', None)
x = x.set('test_template', DEFAULT, p(x,b),
z())"""
rx = r'''\bx\.set\((?:\s*(?:,\s*)?(?<o>[- ]?\d*\.?\d (?:[Ee][- ]?\d )?|\w (?<a>\((?:[^()] |(?&a))*\))*|'[^'\\]*(?:\\.[^'\\]*)*'|"[^"\\]*(?:\\.[^"\\]*)*"))*\s*\)'''
print( [x.captures("o") for x in regex.finditer(rx, text, regex.S)] )
輸出:
[["'1.2'"], ["'python_version'", 'None'], ["'test_template'", 'DEFAULT', 'p(x,b)', 'z()']]
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/326791.html
