2012-04-04 24 views
0

Ich benutze re.findall(p, text) ein Muster im Allgemeinen entsprechen, aber jetzt bin ich auf eine Frage:Wie können spezielle Regex-Zeichen in einer Zeichenfolge entfernt werden?

Ich will nur p als normaler String angepasst werden, nicht regex.

Zum Beispiel: p kann '+' oder '*' enthalten, ich möchte nicht, dass diese Zeichen besondere Bedeutungen wie in Regex haben. Mit einem anderen Wort möchte ich, dass p Zeichen für Zeichen zugeordnet wird.

In diesem Fall ist mir unbekannt, daher kann ich '\' nicht hinzufügen, um Sonderzeichen zu ignorieren.

+0

Wenn Sie 'p' nicht wissen, wie können Sie es als Regex verwenden? – Marcin

+1

@Marcin: Er hat keine a priori Informationen über 'p', so dass er die bereits entgangene Zeichenfolge nicht fest codieren kann. Siehst du nicht, warum das abgelehnt wurde? –

+0

@NiklasB. Nun, vielleicht, aber warum konnte er Sonderzeichen nicht entkommen, wenn er die Zeichenfolge hat? – Marcin

Antwort

10

Sie re.escape verwenden können:

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

Oder nur String-Operationen verwenden, um zu überprüfen, ob p in einer anderen Zeichenfolge ist:

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

By the way, ist dies vor allem dann nützlich, wenn Sie einbetten möchten in eine richtige Regex:

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

Ich möchte re.findall() verwenden, also denke ich, dass re.escape() das Beste für mich ist! :) –

+0

@ZhuShengqi: Um nach einem wortwörtlichen String zu suchen, ist 're.findall()' im Prinzip nutzlos; 'res.findall (" ab "," abcabcabc ")" ergibt "[" ab "," ab "," ab "]'. Sie wollen wahrscheinlich 'str.count()'. –

+0

@Zhu: Ja, wenn du * reguläre Ausdrücke nicht brauchst, benutze sie nicht. Umstände, bei denen das Entweichen nützlich sein könnte, sind (a) Sie wollen 'p' in einen komplexeren Regex integrieren. (B) Sie wollen mit einer Liste von regulären Ausdrücken übereinstimmen, von denen einige reine Textsuchen sind und einige komplexer sind. –

2

Wenn yo u braucht nicht einen regulären Ausdruck, und will einfach nur testen, ob das Muster ein Teil der Zeichenfolge ist, verwenden:

if pattern in string: 

Wenn Sie am Anfang oder Ende des Strings testen willst:

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

Im Abschnitt string methods der Dokumentation für andere String-Methoden.

Wenn Sie alle Standorte einer Teil in einem String wissen müssen, verwenden Sie 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

Sie .find auf Strings verwenden können. Dies gibt den Index des ersten Vorkommens der "Nadel" -String (oder -1, wenn es nicht gefunden wird) zurück. z.B.

>>> a = 'test string 1+2*3' 
>>> a.find('str') 
5 
>>> a.find('not there') 
-1 
>>> a.find('1+2*') 
12 
Verwandte Themen