I'm trying to create a regex that accept: An empty string, a single integer or multiple integers separated by a comma b开发者_StackOverflow中文版ut can have no starting and ending comma.
I managed to find this, but I cannot undertsand how to remove the digit limit
^\d{1,10}([,]\d{10})*$
The thing you posted still requires at least 1 integer, so it won't match an empty string:
Here is what you need:
^(\d+(,\d+)*)?$
Explaination:
- put the entire thing in parenthesis and end with a
'?'
so as to match the empty string. - Always start with an integer, so
'\d+'.
That is 1 or more digit characters('0'-'9')
- Then make a set of parenthesis which contains
',\d+'
and put an asterisk after it.
3a. The inside means start with a ',' then an integer. 3b. The asterisk means repeat everything inside the parenthesis 0 or more times.
Hench the whole thing is either an empty string or start with an integer then repeat zero or more times a string which starts with a comma and ends with an integer
{1,10}
and {10}
are ranges. You can replace them with +
for infinite-positive. Eg.:
^\d+([,]\d+)*$
Try the following:
^(\d+(,\d+)*)?$
Some of the other answers hit on 4 digits between commas. Here is a slight variation with an optional sign and enforcing 3 digits between commas:
^[+-]?(\d+(,\d{3})*)$
I would extend tster's answer by making the inner group a non capturing group.
^(\d+(?:,\d+)*)?$
Consider for example
re.search('^(\d+(?:,\d+)*)?$', "1,2,3,4").groups()
('1,2,3,4',)
which returns a tuple of 1 element. But if the inner group is a capturing group, you get one extra element at the end.
re.search('^(\d+(,\d+)*)?$', "1,2,3,4").groups()
('1,2,3,4', ',4')
精彩评论