2017-06-12 6 views
0

Ich habe einen Wert, der meiner Meinung nach eine Zahl ist, aber die RegEx, die ich verwende, um zu bestätigen, dass der Wert eine Zahl ist, schlägt fehl.RegEx, um zu überprüfen, ob eine Zeichenfolge eine Zahl ist

Ich bin nicht sicher, ob es der Wertfehler oder die RegEx ist, weil diese RegEx für mich in früheren Fällen arbeitete.

regnumber = re.compile(r"(\d),(\d) | (\d)") 

print("final weight:", weight) 

if regnumber.search(weight): 
    print("weight = an int") 

else: 
    print("weight does not = int") 

Dieses Stück Code erzeugt:

final weight: 7088     
weight does not = int 

Kann mir jemand erklären, warum entweder meine RegEx ausfällt oder wie das ist nicht eine Zahl?

Danke.

+0

Warum verwenden Sie ein Komma? –

+2

Wenn Sie nach einer Ziffernfolge suchen, verwenden Sie '\ d +' –

+0

In der RegEx? Weil ich manchmal Zahlen mit Kommas begegnen werde, also muss ich diese auch berücksichtigen. Wie '2,345' – theprowler

Antwort

4

Ein Integer (ganze Zahl) ist eine Folge von einer oder mehreren Ziffern. Also:

re.compile(r'\d+') 

Aber in diesem Fall brauchen Sie nicht einen regulären Ausdruck, ein einfach str.isdigit() genügt:

if weight.isdigit(): 
    print("weight = an int") 
else: 
    print("weight does not = int")

A Dezimalzahl, kann mit der folgenden regex abgestimmt werden:

re.compile(r'\d+(?:,\d*)?') 

So können Sie die Eingabe mit überprüfen:

regnumber = re.compile(r'\d+(?:,\d*)?') 

print("final weight:", weight) 
if regnumber.match(weight): 
    print("weight = a number") 
else: 
    print("weight does not = number")

Beachten Sie, dass ein Regex nach einer beliebigen Untersequenz sucht. So wird 'foo123,45bar' auch übereinstimmen. Sie können die ^ und $ Anker verwenden, um vollständige Matching zu erzwingen:

regnumber = re.compile(r'^\d+(?:,\d*)?$') 

print("final weight:", weight) 
if regnumber.match(weight): 
    print("weight = a number") 
else: 
    print("weight does not = number")

Wie @chris85 sagt: Sie , in der Regex mit [,.] ersetzen kann den Punkt (.) zu ermöglichen als Dezimalpunktes als auch verwendet werden .

+0

Wird ein Komma für eine Dezimalzahl in Europa verwendet oder ist das ein Tippfehler? Vielleicht wäre '\ d + (?: [,.] \ D *)' besser – chris85

+1

@ chris85: In Belgien wird tatsächlich ein Komma als Dezimalpunkt verwendet. Ich weiß nichts über den Rest von Europa. –

2

Um Ziffern möglich Leerzeichen als Treffer und Kommata Sie r'[\d ]+(,\d+)?' Es gibt auch eine vollständige Übereinstimmung für Zahlen mit oder ohne Komma, aber keine ungültigen Komma Vorkommnisse wie ,, oder 1, oder ,9

Beispiele von dem, was können es wird

    überein
  • 39,8
  • 1 259,12312

Wird nicht passen:

  • ,,
  • 10,
  • , 0
+0

@ chris85 Wahr. Danke, ich bin immer etwas zu schnell bei Regex. Aktualisiert, um mehr Fälle zu erfassen und nicht mit anderen zu vergleichen –

1

Vielleicht ist es besser um es so zu machen?

>>> val = 92092 
>>> type(val) 
<class 'int'> 
>>> val = 893.22 
>>> type(val) 
<class 'float'> 

Auch, wenn Sie mit der RegEx bleiben wollen ... Versuchen: (\ d) +

+0

Sie können testen, ob es ein int ist, indem Sie Folgendes tun: if (type (val) == int): print ('is int'); – OmaRPR

Verwandte Themen