2014-05-08 7 views
5

Ich möchte eine Python Regex entweder eine Klammer oder eine leere Zeichenfolge erfassen. Der übliche Ansatz funktioniert nicht. Ich muss irgendwo etwas entkommen, aber ich habe alles versucht, was ich weiß.Wie passe ich null oder mehr Klammern in Python Regex

one = "this is the first string [with brackets]" 
two = "this is the second string without brackets" 

# This captures the bracket on the first but throws 
# an exception on the second because no group(1) was captured 
re.search('(\[)', one).group(1) 
re.search('(\[)', two).group(1) 

# Adding a "?" for match zero or one occurrence ends up capturing an 
# empty string on both 
re.search('(\[?)', one).group(1) 
re.search('(\[?)', two).group(1) 

# Also tried this but same behavior 
re.search('([[])', one).group(1) 
re.search('([[])', two).group(1) 

# This one replicates the first solution's behavior 
re.search("(\[+?)", one).group(1) # captures the bracket 
re.search("(\[+?)", two).group(1) # throws exception 

Ist die einzige Lösung für mich zu überprüfen, dass die Suche zurückgegeben wird Keine?

+1

I‘ d sagen, du brauchst die einfangende Gruppe nicht. Sehen Sie, ob '\ [' übereinstimmt oder nicht. Was sollte der Zweck der Capturing-Gruppe überhaupt sein, wenn das Einzige, was sie erreichen kann, ein einzelner [. – donfuxx

+0

Nicht sicher, was das Problem ist. Sie möchten eine Klammer oder eine leere Zeichenfolge zuordnen. Die zweite Eingabe enthält eine leere Zeichenfolge zwischen den einzelnen Zeichen, sodass sie mit der leeren Zeichenfolge übereinstimmt. – Barmar

+0

Im Allgemeinen sind optionale Elemente in einem regulären Ausdruck nur dann sinnvoll, wenn sie vor oder nach einem anderen Element liegen, das Sie abgleichen möchten. Die Suche selbst macht keinen Sinn - wenn es optional ist, stimmt die Eingabe überein, ob sie enthalten ist oder nicht. – Barmar

Antwort

2

Hier ist ein anderer Ansatz.

import re 

def ismatch(match): 
    return '' if match is None else match.group() 

one = 'this is the first string [with brackets]' 
two = 'this is the second string without brackets' 

ismatch(re.search('\[', one)) # Returns the bracket '[' 
ismatch(re.search('\[', two)) # Returns empty string '' 
6

Die Antwort ist einfach! :

(\[+|$) 

Da die einzige leere Zeichenfolge, die Sie erfassen müssen, die letzte der Zeichenfolge ist.

0

Letztendlich wollte ich eine Saite nehmen und, wenn ich quadratische oder geschweifte Klammern finde, die Klammern und deren Inhalt aus der Saite entfernen. Ich hatte versucht, die Fäden zu isolieren, die zum ersten Mal benötigte Fixierung durch eine Übereinstimmung zu finden und die die resultierende Liste in einem zweiten Schritt zur Festsetzung, wenn alles, was ich in der gleichen Zeit beides tun musste, war wie folgt:

re.sub ("\[.*\]|\{.*\}", "", one) 
Verwandte Themen