2015-03-25 41 views
1

我试图创建一个Python正则表达式“一个或两个数字的数字序列由可选的多个空格或可选的单个逗号分隔。”我应该如何为一个/两位数字序列编写一个python正则表达式?

例如:

" 1" Should tests good 
" 1 2  3 3 4 5 7 17" Should test good 
" 1, 2,3,11,74" Should test good 
"1,11,14, 15" Should test good 

"111, 101" Should not test good 
"1 2 3 a" Should not test good 
"1, 25, 5.0 " Should not test good 
"1,, 7, 80" Should not test good 
"1,11,14," Should not test good 

逗号迹象应该只数字(或空格)之间出现。这就是为什么最后一个例子不宜测试的原因。

我试着用this

^\s*\d{1,2}(\s*\,?\d{1,2}\s*\,?)*\s*$ 

,但得到不好的结果,例如 “11111” 将考验不错。我应该如何编写我的正则表达式?

+2

这怎么'” 1" '好?它只有一个数字。 – Marcin 2015-03-25 05:16:26

+0

是的,它可以是好的 – diegoaguilar 2015-03-25 05:19:37

+0

但是你写了“两位数字”。你能澄清这一点吗? – Marcin 2015-03-25 05:20:46

回答

2

此正则表达式应该工作^(\s*\d{1,2}\s*$)|^((\s*\d{1,2}\s*[\,\s]\s*\d{1,2}\s*))+([\,\s]\s*\d{1,2}\b\s*)*$。请注意,要捕获1到2次,请使用{1,2},其中逗号前面的数字是下边界,而逗号后面的数字是上边界。它的工作方式是我们捕获^(\s*\d{1,2}\s*$)^((\s*\d{1,2}\s*[\,\s]\s*\d{1,2}\s*))+([\,\s]\s*\d{1,2}\b\s*)*$。对于第一个选项,我们首先查找String ^的开头。接下来,我们寻找一个可选的无限量空间\s*,后面跟着一个或两个数字(\d{1,2}),随后是可选的无限量空间,然后是字符串$的结尾。对于第二个选项,我们允许可选无限空间\s*后跟一位或两位数字\d{1,2},然后是可选的无限量空间\s*。接下来,我们允许逗号或空格[\,\s]。然后我们再次允许可选的无限空间\s*,后跟一位或两位数字\d{1,2},然后是可选无限空间\s*。这必须至少发生一次+才能被视为匹配(只有空格或者以逗号开头的任何内容不会匹配)。它后面可以跟一个逗号或空格[\,\s],后面跟着无限的空格\s*,后跟一个或两个数字号码\d{1,2}。随后是边界\b和可选的无限量空间​​。此组可能会发生可选的无限次数,因此*和之后的字符串为$

+0

让我们[在聊天中继续讨论](http://chat.stackoverflow.com/房间/ 73724 /讨论-间diegoaguilar-和moishe-lipsker)。 – diegoaguilar 2015-03-25 06:20:18

+0

@diegoaguilar我很确定有一种方法。但我不确定如何去做。我还在学习正则表达式。 – 2015-03-25 06:21:07

+0

@diegoaguilar试试这个正则表达式要求每个数字有一个!其后至少有一个空格^(\ s * \!\ s + \ d {1,2} \ s * $)| ^((\ s * \!\ s + \ d {1,2} \ s * [\,\ S] \ S * \!\ S + \ d {1,2} \ S *))+([\,\ S] \ S * \!\ S + \ d {1,2} \ b \ s *)* $ – 2015-03-25 09:31:26

1

您可以修改您正则表达式

^\s*\b\d{1,2}\b(?:\s*\,?\s*\b\d{1,2}\b)*\s*$ 

观看演示。

https://regex101.com/r/sJ9gM7/5#python

+0

它为什么包含一个字边界? – diegoaguilar 2015-03-25 05:24:51

+0

我发现一个问题,'1,11,14,'测试好,它不应该 – diegoaguilar 2015-03-25 05:33:28

+0

即使是一个空字符串似乎测试好... – diegoaguilar 2015-03-25 05:36:52

1

这其中也确保你只有一个逗号

^\s*\d{1,2}(\s*[,\s]\s*\d{1,2})*\s*$ 

这里有一个演示:

https://regex101.com/r/jW7qL5/1

附加请求信息

演示给出了一个解释语法(右侧面板)。

表达式[,\ s] \ s * \ d {1,2}确保逗号总是出现在一个或多个数字之前(可选空格之间)。

我使用标志GM(全局和多行)来匹配几行文本,但这取决于你想如何使用它。

使用下面的正则表达式来捕捉数字

^\s*(\d{1,2})(?:\s*[,\s]\s*(\d{1,2}))*\s*$ 

的(?:语法是用来防止该组贝因拍摄

+0

非常好,谢谢..您能否扩展并解释语法,关于如何使用捕获多个组以及如何确保最终不会出现逗号,并且没有以下任何数字?还有关于如何使用标志以创建良好的正则表达式? – diegoaguilar 2015-03-25 05:41:43

+0

你想在小组中捕捉什么? – sparkplug 2015-03-25 05:53:27

+0

有没有办法让捕获组获得全部有效数字? – diegoaguilar 2015-03-25 05:55:05

3

使用regex模块蟒蛇,你可以有这个(颇为曲折!)正则表达式:

(?:^\s*|\G)\s*(?:,\s*)?\K(\b\d{1,2}\b)(?=(?:\s*(?:,\s*)?\b\d{1,2}\b)*$) 

regex101 demo

(?:^\s*|\G)     # Matches beginning of line and any spaces, or at the end of the previous match 
\s*(?:,\s*)?     # Spaces and optional comma 
\K        # Resets the match 
(\b\d{1,2}\b)     # Match and capture 1-2 digits 
(?=       # Makes sure there is (ahead) ... 
    (?: 
    \s*(?:,\s*)?\b\d{1,2}\b # A sequence of spaces (with optional comma) and 1-2 digits... 
)*       # ... any number of times until... 
$)        # ... the end of the line 

这一次应该会更快:

(?:^(?=(?:\s*(?:,\s*)?\b\d{1,2}\b)*$)|\G)\s*(?:,\s*)?\K(\b\d{1,2}\b) 
+0

与re模块有什么区别?它有什么要注意的吗? – diegoaguilar 2015-03-25 06:41:36

+0

@diegoaguilar不同的是,这个模块有更多的功能,那些当前存在于PCRE中的功能(perl兼容正则表达式)。特别是在这里,我正在使用'\ G'和'\ K',它们在're'模块中不可用。我不确定你的对手是什么意思。 – Jerry 2015-03-25 06:43:14

+0

对不起,我的意思是警告:P – diegoaguilar 2015-03-25 06:44:30