我一直在試圖匹配以下字符串中匹配一個括號:Python的正則表達式:括號
string = "TEMPLATES = (('index.html', 'home'), ('base.html', 'base'))"
但不幸的是我的正則表達式的知識是非常有限的,因爲你可以看到有一些需要兩個括號以及第二個內容 我嘗試使用re.match("\(w*\)", string)
,但它沒有工作,任何幫助將不勝感激。
我一直在試圖匹配以下字符串中匹配一個括號:Python的正則表達式:括號
string = "TEMPLATES = (('index.html', 'home'), ('base.html', 'base'))"
但不幸的是我的正則表達式的知識是非常有限的,因爲你可以看到有一些需要兩個括號以及第二個內容 我嘗試使用re.match("\(w*\)", string)
,但它沒有工作,任何幫助將不勝感激。
嘗試這種情況:
import re
w = "TEMPLATES = (('index.html', 'home'), ('base.html', 'base'))"
# find outer parens
outer = re.compile("\((.+)\)")
m = outer.search(w)
inner_str = m.group(1)
# find inner pairs
innerre = re.compile("\('([^']+)', '([^']+)'\)")
results = innerre.findall(inner_str)
for x,y in results:
print("%s <-> %s" % (x,y))
輸出:
index.html <-> home
base.html <-> base
說明:
outer
使用\(
和\)
括號的第一起始基團相匹配;默認search
找到最長的匹配,給我們最外面的()
對。比賽m
包含這些外括號之間的內容;其內容對應於.+
位outer
。
innerre
比賽正是你('a', 'b')
雙,再次使用\(
和\)
以匹配您的輸入字符串的內容括號,並使用' '
內兩組匹配單引號內的字符串之一。
然後,我們用findall
(而不是search
或match
)獲得所有比賽爲innerre
(而不僅僅是一個)。此時,results
是一對配對列表,如打印循環所示。
更新:爲了配合整個事情,你可以嘗試這樣的事:
rx = re.compile("^TEMPLATES = \(.+\)")
rx.match(w)
您的示例正在查找打開的文件,然後是零個或多個字母w,然後是關閉文件。您可能想要使用\ w而不是w,但無論如何,這在您的情況下都不起作用,因爲您在開放paren旁邊有非單詞字符。
我想你應該考慮在逗號分割字符串。你最終的目標是什麼?
更好地使用正確的解析模塊,如pyparsing在這裏。
首先,使用\(
不足以匹配括號。 Python通常會對其字符串中的某些轉義序列作出反應,這就是爲什麼它將\(
解釋爲簡單的(
。您必須編寫\\(
或使用原始字符串,例如r'\('
或r"\("
。
其次,當您使用re.match
時,您正在將正則表達式搜索錨定到字符串的開頭。如果您想在字符串中的任何位置查找圖案,請使用re.search
。
就像約瑟夫在他的回答中所說的,它不完全清楚你想找到什麼。例如:
string = "TEMPLATES = (('index.html', 'home'), ('base.html', 'base'))"
print re.findall(r'\([^()]*\)', string)
["('index.html', 'home')", "('base.html', 'base')"]
編輯:
我認錯,@phooji is right:轉義是在這種特殊情況下無關。但re.match
與re.search
或re.findall
仍然重要。
我想要做的就是匹配字符串「TEMPLATES =((''index.html','home'),('base.html','base'))」並將其替換爲另一個字符串,有沒有辦法匹配「TEMPLATES =」部分與括號一起?順便說一句,謝謝你的解釋 – Paulo 2011-03-18 20:48:54
其實're.match(「\(hello \)」,「(hello)」)'工作得很好,雖然我同意總是更容易總是使用'r「...」用於正則表達文字。 – phooji 2011-03-18 21:00:24
@paulo:你想用這個匹配來做什麼,驗證格式? – 2011-03-18 21:09:05
如果你的字符串看起來像合法的Python代碼,反正你可以這樣做:
import ast
var, s = [part.strip() for part in
"TEMPLATES = (('index.html', 'home'), ('base.html', 'base'))".split('=')]
result= ast.literal_eval(s)
感謝您的答覆,但它可以匹配整個字符串,包括「TEMPLATES =」部分,以便我可以用另一個字符串替換整個事情? – Paulo 2011-03-18 20:56:33
@paulo:我添加了一個匹配整個字符串的正則表達式。 – phooji 2011-03-18 21:05:35
非常感謝你,我非常感謝你的幫助,並感謝所有貢獻者:D – Paulo 2011-03-18 21:09:52