2011-06-26 71 views
0

誰能幫我明白爲什麼這個工程......不能通過值到re.findall(蟒蛇)

z = re.findall(r'(foobar)', string) 

但是,這不?

regexStr = "r'(foobar)'" 
z = re.findall(regexStr, string) 

我打印了regexStr並確定它的輸出與r'(foobar)'相同。

有人可以幫忙嗎?我也嘗試過逃離撇號。

JD

回答

0

一個解決問題的方法是

regexStr = r'(%s)' % searchString 

其中搜索字符串將取代%S

在Python它往往是更好地使用此結構比普通級聯。 (意思str1 + str2 + ...) 特別是因爲你不必關心轉換整數雙等等。

更多關於這個問題在這裏:3.5. Formatting Strings

將R不應該是字符串的一部分,它只是告訴Python解釋它是什麼樣的字符串:

r('hello\n') # Raw string => (hello\n) 
u'unicodestring' 
+0

太棒了。非常感謝! – jond

3

上串的「R」改性劑應該是引號

regexStr = r'(foobar)' 

docs以外 - 「字符串文字可以任選地用一個字母‘R’或‘R’前綴;這樣的字符串被稱爲原始字符串,並使用不同的規則來解釋反斜槓轉義序列。「

+0

有趣。我認爲當你給一個文本變量賦一個字符串時,你必須在字符串周圍加引號。謝謝Rich! – jond

+0

其實,我需要做的是將foobar的值傳入這個字符串,就像這個 jond

+0

@jond _「字符串上的」r「修飾符應該在引號之外 」_ So **「r」(「**不正確,也許您想要這樣做:''RegexPatternString = re.escape (searchString).join('()')' – eyquem

0

r修飾符建立一個原始字符串。它告訴Python不要將反斜槓轉義序列轉換爲特殊字符,如\t\n,以便內置字符串。它與正則表達式轉義序列無關。

>>> len('\t') # tab character only 
1 
>>> len(r'\t') # backslach character followed by a tee 
2 

但是,正則表達式語法有它自己的一組轉義規則,它經常與內置Python字符串的轉義規則相沖突。 r關鍵字有助於我們只處理一個。例如,下面的第一個字符串是一個匹配單詞字符的正則表達式文本,第二個字符串也是如此,因爲除非提供r關鍵字,否則Python會將內部字符串的\\轉換爲\

>>> re.compile(r'\w') == re.compile('\\w') 
True 

在你的情況r'(foobar)'是完全等同於'(foobar)'因爲沒有反斜線序列逃跑。這個字符串只是在你腦海中的正則表達式textr關鍵字不會告訴Python以這種方式解釋字符串。 Python只知道正常表達式對象,您使用re.compile()構建或者本身用re.findall()等方法編譯的對象。

編譯正則表達式對象具有與內置字符串轉義序列規則不同的一組規則,正則表達式規則與r關鍵字無關。正則表達式編譯器不明白它的特殊含義,只有Python解釋器才能理解。

在你的情況下,r關鍵字"r'(foobar)'"沒有特別處理,因爲它直接傳遞給正則表達式編譯器。您正在構建一個正則表達式,用於搜索以"開頭的字符串,然後是r等等。這就是兩個表達式不同的原因。

>>> re.compile(r'(foobar)') == re.compile('"r(foobar)"') # your expressions 
False 

r關鍵字的使用已經在這裏沒有任何影響:

>>> re.compile(r'(foobar)') == re.compile('(foobar)') 
True 
>>> re.compile(r'"r(foobar)"') == re.compile('"r(foobar)"') 
True 

欲瞭解更多信息: