我用re.findall(p, text)
爲大致匹配的模式,但現在我遇到了一個問題:如何逃避字符串中的特殊正則表達式字符?
我只想p
進行匹配作爲一個正常的字符串,而不是正則表達式。
例如:p可能包含'+'或'*',我不希望這些字符在正則表達式中有特殊含義。換句話說,我希望p是逐字符匹配的。
在這種情況下,p
對我來說是未知的,所以我不能在其中添加'\'來忽略特殊字符。
我用re.findall(p, text)
爲大致匹配的模式,但現在我遇到了一個問題:如何逃避字符串中的特殊正則表達式字符?
我只想p
進行匹配作爲一個正常的字符串,而不是正則表達式。
例如:p可能包含'+'或'*',我不希望這些字符在正則表達式中有特殊含義。換句話說,我希望p是逐字符匹配的。
在這種情況下,p
對我來說是未知的,所以我不能在其中添加'\'來忽略特殊字符。
您可以使用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>
我想使用re.findall(),所以我認爲re.escape()最適合我! :) – 2012-04-04 14:43:01
@朱勝奇:爲了尋找一個逐字字符串,'re.findall()'實際上是無用的; 'res.findall(「ab」,「abcabcabc」)'產生'[「ab」,「ab」,「ab」]'。你可能需要'str.count()'。 – 2012-04-04 14:44:56
@朱:是的,如果你不需要*正則表達式,不要使用它們。 (a)你想把'p'集成到更復雜的正則表達式中(b)你想匹配正則表達式列表,其中一些只是純文本搜索,而另一些則更爲複雜。 – 2012-04-04 14:46:34
如果喲你不需要一個正則表達式,而只是想測試,如果該模式是一個字符串的子串,使用:
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)
您可以在字符串使用.find
。這將返回「針」字符串首次出現的索引(如果未找到,則返回-1
)。例如
>>> a = 'test string 1+2*3'
>>> a.find('str')
5
>>> a.find('not there')
-1
>>> a.find('1+2*')
12
如果你不知道'p',你怎麼能把它用作正則表達式? – Marcin 2012-04-04 14:36:01
@Marcin:他沒有關於'p'的先驗信息,所以他無法對已經轉義的字符串進行硬編碼。不明白爲什麼這是downvoted? – 2012-04-04 14:36:40
@NiklasB。好吧,也許,但爲什麼他不能逃脫特殊字符,如果他有字符串? – Marcin 2012-04-04 14:38:18