2017-03-01 2 views
0

Ich versuche, eine Funktion zu machen, die nur den zweistelligen Interger aus einem bestimmten Regex-Ausdruck extrahiert.Wie kann ich eine zweistellige Zahl aus einem Satz mit Regex-Ausdruck extrahieren?

def extract_number(message_text): 
    regex_expression = 'What are the top ([0-9]{2}) trends on facebook' 
    regex= re.compile(regex_expression) 
    matches = regex.finditer(message_text) 
    for match in matches: 
     return match.group() 

    # if there were no matches, return None 
    return None 

So dass, wenn ich drucken

message_text= 'What are the top 54 trends on facebook today' 
print(extract_number(message_text)) 

Ich werde die Nummer 54. bekommen Wenn ich folgendes unter schreibe, bekomme ich die unabhängig von Charakter, den ich setzen in (. +) ... Warum funktioniert es nicht für Zahlen?

def extract_number(message_text): 
    regex_expression = 'What are the top (.+) trends on facebook' 
    regex= re.compile(regex_expression) 
    matches = regex.finditer(message_text) 
    for match in matches: 
     return match.group() 

message_text= 'What are the top fifty trends on facebook today' 
print(extract_number(message_text)) 
+0

Da es nur eine Zahl in der Zeichenfolge, Verwendung 'ist (\ d +) 'um eine Nummer daraus zu extrahieren und mit der ersten erfassten Gruppe darauf zuzugreifen. Hier ist [Demo] (https://regex101.com/r/NJew3u/1) – Tushar

+1

Verwenden Sie den ersten Code, ich habe "Was sind die Top-54-Trends auf Facebook", nicht "54", – EvanL00

Antwort

1

Das einzige Problem mit beiden Ihre Schnipsel ist, dass Sie nicht die Capture-Gruppe Ergebnis von Interesse sind Rückkehr, aber die gesamte Partie:

return match.group() 

ist die gleiche wie return match.group(0), dh gibt es die Gesamtübereinstimmung zurück, die in Ihrem Fall die gesamte Eingabezeichenfolge ist.

dagegen wollen Sie Index 1, das heißt, was die erste Capture-Gruppe - die erste subexpression eingeschlossen in (...), ([0-9]{2}) - Treffer:

return match.group(1) 

es um alle zusammen:

def extract_number(message_text): 
    regex_expression = 'What are the top ([0-9]{2}) trends on facebook' 
    regex= re.compile(regex_expression) 
    matches = regex.finditer(message_text) 
    # (See bottom of this answer for a loop-less alternative.) 
    for match in matches: 
     return match.group(1) # index 1 returns what the 1st capture group matched 

    # if there were no matches, return None 
    return None 

message_text= 'What are the top 54 trends on facebook today' 
print(extract_number(message_text)) 

Dies ergibt die gewünschte Ausgabe:

54 

Hinweis: Da @ EvanL00 weist darauf hin, da immer nur Spiel benötigt wird, ist die Verwendung von regex.finditer() mit einer nachfolgenden for Schleife, die bedingungslos in der ersten Iteration zurückgibt, ist unnötig und kann die Absicht der verschleiern Code; Je einfacher und klarer Ansatz ist:

match = regex.search(message_text) # Get first match only. 
if match: 
    return match.group(1) 
0

Dies sollte für numerisches/string arbeiten:

def extract_number(message_text): 
    regex_expression = 'What are the top ([a-zA-Z0-9]+) trends on facebook' 
    regex= re.compile(regex_expression) 
    matches = regex.findall(message_text) 
    if matches: 
     return matches[0] 

message_text= 'What are the top fifty trends on facebook today' 
print(extract_number(message_text)) 
message_text= 'What are the top 50 trends on facebook today' 
print(extract_number(message_text)) 
message_text= 'What are the top -- trends on facebook today' 
print(extract_number(message_text)) 

Ausgang:

fifty 
50 
None 
Verwandte Themen