我应该如何为一/两位数字序列编写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

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

我试过这个:

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

但得到的结果并不好,例如"11111"测试会很好。我应该如何编写正则表达式?

此正则表达式应适用于^(s*d{1,2}s*$)|^((s*d{1,2}s*[,s]s*d{1,2}s*))+([,s]s*d{1,2}bs*)*$。请注意,要捕获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}bs*)*$。对于第一个选项,我们首先查找字符串^的开头。接下来,我们寻找一个可选的无限空间量s*,后面跟着一个或两个数字(d{1,2}),后面跟着可选的无穷空间量,然后是字符串$的末尾。对于第二个选项,我们允许可选的无限空间s*,后跟一个或两个数字d{1,2},后跟可选的无限量空间s*。接下来,我们允许使用逗号或空格[,s]。然后我们再次允许可选的无限空间s*,后面跟着一个或两个数字d{1,2},后面跟着可选的无穷空间s*。这必须至少发生一次+才能被视为匹配(只有空白或任何以逗号开头的内容都不匹配)。它可以后跟逗号或空格[,s],后跟无限大的空格s*,后跟一个或两个数字d{1,2}。这之后是边界CCD_ 20和可选的无限量的空间CCD_。这个组可以出现任意的无限次,因此是*,后面是$,字符串的末尾。

使用python的regex模块,您可以获得以下(相当复杂!)regex:

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

regex101演示

(?:^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
(bd{1,2}b)                  # Match and capture 1-2 digits
(?=                            # Makes sure there is (ahead) ...
  (?:
     s*(?:,s*)?bd{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*)?bd{1,2}b)*$)|G)s*(?:,s*)?K(bd{1,2}b)

您可以修改正则表达式

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

请参阅演示。

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

这个还确保您只有一个逗号

^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*$

(?:语法用于防止该组被捕获

最新更新