2016-05-13 16 views
1

Meine Regex-Syntax liefert nicht die korrekten Ergebnisse. Ich habe Daten von GitHub zurückgegeben, die die github3.py-Bibliothek verwenden, die beim Analysieren des Patch-Schlüssels von MD-Dateien (https://developer.github.com/v3/pulls/#list-pull-requests-files) drei mögliche Zeichenfolgen zurückgibt. Ich habe die Regex-Dokumentation und mehrere Threads gelesen, aber mir fehlt etwas in meiner Syntax.Python-Regex-Anweisung liefert keine korrekten Ergebnisse

string1 = '> [HELP.SELECTOR]'
string2 = '-> [HELP.SELECTOR]'
string3 = '+> [HELP.SELECTOR]'

Ich möchte für die exakte Übereinstimmung mit string2 oder string3 und False True drucken, wenn string1 gefunden wird. Meine Ergebnisse geben False zurück, wenn string2 oder string3 gefunden wird.

for prs in repo.pull_requests(): 
    search_string_found = 'False' 
    regex_search_string1 = re.compile(r"^\+>\s\[HELP.SELECTOR\]") 
    regex_search_string2 = re.compile(r"^->\s\[HELP.SELECTOR\]") 
    for data in repo.pull_request(prs.number).files(): 
     match_text1 = regex_search_string1.search(data.patch) 
     match_text2 = regex_search_string2.search(data.patch)       
     if match_text1 is not None and match_text2 is not None: 
      search_string_found = 'True' 
      break 

    print('HELP.SELECTOR present in file: ', search_string_found) 
+1

Gerade Test gegen einen regulären Ausdruck: 'regex_search_string re.compile = (r "^ [+ -]> \ s \ [HELP \ .SELECTOR \]")', dann gilt: 'wenn regex_search_string.search (data .patch): ' –

+0

Ihre Lösung hat funktioniert. Ich änderte die Regex, indem ich das Caret entfernte und die korrekten Ergebnisse zurückgaben. 'regex_search_string = re.compile (r" [\ + -]> \ s \ [HILFE \ .SELECTOR \] ")'. – DBS

+0

Das bedeutet, dass die benötigten Strings nicht am Anfang der Saite waren, oder? –

Antwort

1

Da Sie Ihre Saiten bestätigen kann nicht an der Zeichenfolge Start befinden, müssen Sie

regex_search_string = re.compile(r"[+-]>\s\[HELP\.SELECTOR\]") 
for data in repo.pull_request(prs.number).files(): 
    match_text = regex_search_string.search(data.patch) 
    if match_text: 
     search_string_found = 'True' 
     break 

Hinweis:

  • [+-] Matches entweder ein + oder ein - da es eine Zeichenklasse, die darin ein einzelnes Zeichen Spiele aus einem Bereich/set angegeben
  • + innerhalb [...] hat nicht immer
  • - maskiert werden am Anfang oder Ende von [...] muss nicht maskiert werden
  • re.search gibt ein Matchdatenobjekt oder None zurück, Sie müssen es zuerst überprüfen, bevor Sie auf den Text zugreifen, der übereinstimmt/
  • erfasst
0

Es ist einfacher, eine Regex-Zeichenfolge als mehrere zu verwalten. Versuchen Sie folgendes:

import re 

strings = [ 
    '> [HELP.SELECTOR]$', 
    '-> [HELP.SELECTOR]$', 
    '+> [HELP.SELECTOR]$', 
] 

for string in strings: 
    print (bool(re.match(r'[-+]> \[HELP.SELECTOR\]$', string)), string) 

Ergebnis:

False > [HELP.SELECTOR] 
True -> [HELP.SELECTOR] 
True +> [HELP.SELECTOR] 

dass Zutreffen auf Ihr Problem,

#UNTESTED 
for prs in repo.pull_requests(): 
    search_string_found = any(
     re.match(r'[-+]> \[HELP.SELECTOR\]', data.patch) 
     for data in repo.pull_request(prs.number).files()) 
    print('HELP.SELECTOR present in file: ', search_string_found) 
Verwandte Themen