I'm just learning regex and now I'm trying to match a number which more or less represents this:
[zero or more numbers][possibly a dot or comma][zero or more numbers]
No dot or comma is also okay. So it should match the following:
1
123
123.
123.4
123.456
.456
123, # From here it's the same but with commas instead of dot separators
123,4
123,456
,456
But it should not match the following:
0.,1
0a,1
0..1
1.1.2
100,000.99 # I know this and the one below are valid in many languages, but I simply want to reject these
100.000,99
So far I've come up with [0-9]*[.,][0-9]*
, but it doesn't seem to work so well:
>>> import re
>>> r = re.compile("[0-9]*[.,][0-9]*")
>>> if r.match('0.1.'): print 'it matches!'
...
it matches!
>>> if r.match('0.abc'): print 'it matches!'
...
it matches!
I have the feeling I'm doing two things wrong: I don't use match correctly AND my regex is not correct. Could anybody enlighten me on what I'm doing wrong? All tips are welcome!
You need to make
[.,]
part as optional by adding?
after that character class and also don't forget to add anchors.^
asserts that we are at the start and$
asserts that we are at the end.DEMO
If you don't want to allow a single comma or dot then use a lookahead.
DEMO
Your regex would work fine if you just add the ^ at the front and the $ at the back so that system knows how your string would begin and end.
Try this
Try this.Validates all cases.See demo.
http://regex101.com/r/hS3dT7/9
If the two decimal places are mandatory, you could use the following:
This will match the following pattern:
How about:
If you don't want empty string:
Some ideas for verifying a non-empty match:
1.) Use of a lookahead to check for at least one digit:
^
start to$
end.(?=.?\d)
matches if,1
,1
,...\d*[.,]?\d*
Allowed sequence:\d*
any amount of digits, followed by one[.,]
,\d*
.
inside the lookahead is a metacharacter that stands for any character, whereas the other inside the character class[.,]
matches a literal.
Instead of the positive lookahead also a negative one could be used:
^(?!\D*$)\d*[.,]?\d*$
Test at regex101, Regex FAQ
2.) Use 2 different patterns:
(?:
Starts a non-capture group for the alternation.\d+[.,]\d*
for matching1.
,1,1
,...|
OR[.,]?\d+
for matching1
,,1
...Test at regex101