2010-11-21 21 views
1

Ich arbeite mit einem regulären Ausdruck, der eine Zeichenfolge überprüfen würde, ist es eine Funktion oder nicht. Mein regulärer Ausdruck für die Überprüfung, dass Sie wie folgt vor:Regulärer Ausdruck weitere Überprüfung

regex=r' \w+[\ ]*\(.*?\)*' 

Es succefully prüft, ob die Zeichenfolge enthält eine Funktion oder nicht. Aber es packt normale Zeichenfolge, die erste Barcket-Wert enthält, wie "Test (Bedeutung des Tests)".

Also habe ich weiter zu prüfen, dass, wenn es einen Raum zwischen Funktionsnamen und Klammern, die nicht als match.So gefangen werden Ich habe Überprüfung andere wie folgt:

regex2=r'\s' 

Es erfolgreich arbeiten und können Unterscheide zwischen "test()" und "test()". Aber jetzt muss ich eine andere Bedingung beibehalten, dass, wenn es kein Leerzeichen nach den Klammern gibt (zB test() abcd), es es nicht als eine Funktion abfängt. Der reguläre Ausdruck sollte nur als Übereinstimmung behandelt werden, wenn es ähnlich sein wird "test() abcd". Aber ich habe versucht mit verschiedenen regulären Ausdruck, leider funktionieren diese nicht. Ihre eine Sache zu erwähnen die Prüfzeichenfolge ist eingefügt in eine Liste bei, wenn es eine Übereinstimmung findet und im zweiten Schritt überprüft nur den Teil der Zeichenfolge. Beispiel: String: Dies ist eine Python-Funktion test() abcd Zunächst wird der String auf Funktion überprüft und wenn Übereinstimmung mit Funktionstest gefunden wird() dann senden Sie nur "test()" für ob es eine Lücke zwischen "test" und "()" gibt. In diesem letzten Schritt muss ich finden, gibt es eine Lücke zwischen "test()" und "abcd". Wenn es eine Lücke gibt es keine Übereinstimmung als Funktion sonst als eine normale Teil der Zeichenfolge angezeigt. Wie sollte ich den regulären Ausdruck für einen solchen Fall schreiben?

Der reguläre Ausdruck wird in folgenden Fällen zeigen:

1.test() abc 
2.test(as) abc 
3.test() 

wird als Funktion nicht behandeln, wenn:

1.test (a)abc 
2.test()abc 
+0

versuchen Sie, Python-Funktionen zu entsprechen? Wenn ja, versuchen Sie, die Definition oder den Anruf zu erfüllen? – aaronasterling

+0

Nein, ich versuche hauptsächlich C-Stil-Funktion zu entsprechen, und die Regex entspricht allen Arten von Funktionen. Beide Fälle funktionieren und der Anruf. – mushfiq

Antwort

1
(\w+\([^)]*\))(\s+|$) 

Bascially Sie sicherstellen, dass es endet mit entweder Leerzeichen oder Zeilenende.

BTW das kiki-Tool ist für das Debuggen von Python re sehr nützlich: http://code.google.com/p/kiki-re/

0
regex=r'\w+\([\w,]+\)(?:\s+|$)' 
+0

Ich versuchte mit regex = r '\ w + \ s + \\ ([\ w,] +? \\) \ s +' aber es kann nicht fangen "function test()" – mushfiq

+0

der Raum nach 'test' ist jetzt optional – user514868

+0

eigentlich sollte es in den Fällen Übereinstimmung finden: Funktionstest(), Test(), Test (a), Test (a) aas, sollte nicht test(), test() asa fangen. – mushfiq

0


ich das Problem zunächst gelöst habe ich für die Zeichenfolge nur chexked, die "()" mit dem regulären Ausdruck haben:

regex = r' \w+[\ ]*\(.*?\)\w*' 

Dann zur Überprüfung der sowohl den Raum zwischen Funktionsnamen und Klammern, auch die Lücke nach den Klammern, habe ich mit regulären Ausdruck folgende Funktion:

 def testFunction(self, func): 
      a=" " 
      func=str(func).strip() 
      if a in func: 
       return False 
      else: 
       a = re.findall(r'\w+[\ ]*', func) 
       j = len(a) 
       if j<=1: 
        return True 
       else: 
        return False 

So kann nun zwischen "test() abc" und "test() abc" unterschieden werden.
Danke