2012-04-04 84 views
0

我用re.findall(p, text)爲大致匹配的模式,但現在我遇到了一個問題:如何逃避字符串中的特殊正則表達式字符?

我只想p進行匹配作爲一個正常的字符串,而不是正則表達式。

例如:p可能包含'+'或'*',我不希望這些字符在正則表達式中有特殊含義。換句話說,我希望p是逐字符匹配的。

在這種情況下,p對我來說是未知的,所以我不能在其中添加'\'來忽略特殊字符。

+0

如果你不知道'p',你怎麼能把它用作正則表達式? – Marcin 2012-04-04 14:36:01

+1

@Marcin:他沒有關於'p'的先驗信息,所以他無法對已經轉義的字符串進行硬編碼。不明白爲什麼這是downvoted? – 2012-04-04 14:36:40

+0

@NiklasB。好吧,也許,但爲什麼他不能逃脫特殊字符,如果他有字符串? – Marcin 2012-04-04 14:38:18

回答

10

您可以使用re.escape

>>> p = 'foo+*bar' 
>>> import re 
>>> re.escape(p) 
'foo\\+\\*bar' 

或者只是使用字符串操作來檢查p是另一個字符串中:

>>> p in 'blablafoo+*bar123' 
True 
>>> 'foo+*bar foo+*bar'.count(p) 
2 

順便說一句,這是如果你想嵌入主要用p合成正確的正則表達式:

>>> re.match(r'\d.*{}.*\d'.format(re.escape(p)), '1 foo+*bar 2') 
<_sre.SRE_Match object at 0x7f11e83a31d0> 
+0

我想使用re.findall(),所以我認爲re.escape()最適合我! :) – 2012-04-04 14:43:01

+0

@朱勝奇:爲了尋找一個逐字字符串,'re.findall()'實際上是無用的; 'res.findall(「ab」,「abcabcabc」)'產生'[「ab」,「ab」,「ab」]'。你可能需要'str.count()'。 – 2012-04-04 14:44:56

+0

@朱:是的,如果你不需要*正則表達式,不要使用它們。 (a)你想把'p'集成到更復雜的正則表達式中(b)你想匹配正則表達式列表,其中一些只是純文本搜索,而另一些則更爲複雜。 – 2012-04-04 14:46:34

2

如果喲你不需要一個正則表達式,而只是想測試,如果該模式是一個字符串的子串,使用:

if pattern in string: 

如果你想在字符串的開頭或結尾,以測試:

if string.startswith(pattern): # or .endswith(pattern) 

有關其他字符串方法,請參閱文檔的string methods部分。

如果你需要知道在字符串中的子字符串的所有位置,使用str.find

offsets = [] 
offset = string.find(pattern, 0) 
while offset != -1: 
    offsets.append(offset) 
    # start from after the location of the previous match 
    offset = string.find(pattern, offset + 1) 
0

您可以在字符串使用.find。這將返回「針」字符串首次出現的索引(如果未找到,則返回-1)。例如

>>> a = 'test string 1+2*3' 
>>> a.find('str') 
5 
>>> a.find('not there') 
-1 
>>> a.find('1+2*') 
12 
相關問題