2017-04-01 3 views
0

Ich versuche, Zahlen in Wortform aus einer Zeichenfolge zu extrahieren. Zum Beispiel könnte eine Eingabezeichenfolge so etwas wie:Regulärer Ausdruck, um große Zahlen in Wortform zu finden

"What is 3 million 6 hundred 5 divided by 5 hundred?" 

Von diesem Eingang, würde ich, um herauszufinden, wie wie die beiden Zahlen als Gruppen zu erhalten.

["3 million 6 hundred 5", "5 hundred"] 

Hinweis: Es ist möglich, dass es auch in anderen Eingabeketten ergab mehr Zahlen.

Ich glaube, Regex ist der richtige Weg, um dieses Problem zu lösen. Ich könnte im Idealfall in einer Liste der Waage passieren wie:

["hundred", "thousand", "million", "billion", ...] 

Bisher ist das, was ich habe:

scales= ["hundred", "thousand", "million", "billion"] 
scale_pattern = '|'.join(scales) 
regex = re.compile('\b(d+' + scale_pattern + 'd+)+\b') 

Ich weiß, dass mein Muster ist nicht ganz richtig, die psudeocode für das, was ich ‚für werde ist:

for any number of the following occurrences: 
    find the pattern [int word_from_list optional_int] 
+1

Wow, viele Stimmen kommen schnell herein, um diese Frage zu beenden. Irgendwelche Rückmeldungen was ich tun könnte um es zu verbessern? – Gunther

+1

Zeigen Sie, was Sie bisher versucht haben. – ArieKanarie

+0

Sicher, danke. Ich werde es mit dem, was ich bisher habe, aktualisieren. – Gunther

Antwort

3

Idealerweise könnte ich in einer Liste der Waage passieren

Sie können sie in nicht erfassender oder einfangender Gruppe wie folgt übergeben.

Regex:(?:\d+\s(?:million|hundred|thousand|billion)*\s*)+

Oben ist eine einfache regex für eine Reihe \d+ von einem Leerzeichen gefolgt Überprüfung \s und Skala die optional ist (von * quantifier verwendet wird) für letzte Zahl von optionalen Leerzeichen gefolgt . Und das ganze Muster wiederholt eine oder viele mal (mit + Quantifikator).

Regex101 Demo

0

Nun, unten ist ein schlechter Parser.

# you should expand these lists later... 
units = ["hundred", "thousand", "million", "billion"] 
operations = ['divided', 'multiplied'] 
delims = ['by', 'with'] 
discards = ['?', '!', '.'] 

sentence = 'What is 3 million 6 hundred 5 divided by 5 hundred?' 

filterd_sentence = sentence 
for t in discards: 
    filterd_sentence = filterd_sentence.replace(t, '') 

filterd_t = [] 
buffer = '' 
for t in filterd_sentence.split(' '): 
    if t.isnumeric() or t in units: 
     buffer += t + ' ' 
    elif t in operations or t in delims: 
     if buffer != '': 
      filterd_t.append(buffer[:len(buffer)-1]) 
      buffer = '' 

if buffer != '': 
    filterd_t.append(buffer[:len(buffer)-1]) 

print(filterd_t) 
# ['3 million 6 hundred 5', '5 hundred'] 
Verwandte Themen