Kaçan normal ifade dizesi


229

Bir kullanıcının girdisini, bazı metinlerin üzerinde arama yapmak için normal ifade deseni olarak kullanmak istiyorum. Çalışıyor, ancak kullanıcının regex'te anlamı olan karakterleri koyduğu durumları nasıl işleyebilirim?

Örneğin, kullanıcı Word'ü aramak ister (s): regex motoru (s)bir grup olarak alır. Bir dize gibi davranmasını istiyorum "(s)" . Ben çalıştırabilirsiniz replacekullanıcı girişi ve değiştirme (ile \(ve )ile \)ama sorun ben olası her regex sembolü için değiştirmek yapmanız gerekecektir olduğunu.

Daha iyi bir yol biliyor musun?

Yanıtlar:


324

Bunun için re.escape()işlevi kullanın :

4.2.3 reModül İçeriği

kaçış (dize)

Alfasayısal olmayan tüm ters eğik çizgilerle dönüş dizesi; bu, içinde düzenli ifade metakarakterleri olabilecek rastgele bir değişmez dizgiyi eşleştirmek istiyorsanız kullanışlıdır.

Basit bir örnek olarak, sağlanan dizenin herhangi bir örneğini isteğe bağlı olarak 's' ile takip edin ve eşleşme nesnesini döndürün.

def simplistic_plural(word, text):
    word_or_plural = re.escape(word) + 's?'
    return re.match(word_or_plural, text)

53

Re.escape () kullanabilirsiniz :

re.escape (string) Tüm alfasayısal olmayanlar ters eğik çizgili dizeyi döndürür; bu, içinde düzenli ifade metakarakterleri olabilecek rastgele bir değişmez dizgiyi eşleştirmek istiyorsanız kullanışlıdır.

>>> import re
>>> re.escape('^a.*$')
'\\^a\\.\\*\\$'

3

Ne yazık ki, re.escape()değiştirme dizesi için uygun değil:

>>> re.sub('a', re.escape('_'), 'aa')
'\\_\\_'

Bir çözüm, lambdaya koymaktır:

>>> re.sub('a', lambda _: '_', 'aa')
'__'

çünkü lambda'nın dönüş değeri re.sub()değişmez bir dize olarak değerlendirilir.


3
replBağımsız değişkeni re.subbir dize değil, bir düzenli ifade ise; re.escapeilk etapta başvurmak mantıklı değil.
Üçlü

5
@tripleee Bu yanlış, replargüman basit bir dize değil, ayrıştırılıyor. Örneğin, re.sub(r'(.)', r'\1', 'X')geri dönecek X, değil \1.
Flimm

4
İşte replargümandan kaçmak için ilgili soru : stackoverflow.com/q/49943270/247696
Flimm

3
3.3 sürümünde değiştirildi: '_' karakteri artık kullanılmıyor. Sürüm 3.7'de değiştirildi: Yalnızca normal ifadede özel bir anlama sahip karakterler kaçar. (Neden bu kadar uzun sürdü?)
Cees Timmerman

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.