我正试图为"由可选多个空格或可选单逗号分隔的一个或两个数字序列"创建一个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*$
(?:语法用于防止该组被捕获