我试图为&#34创建一个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"会测试好。我该怎么写我的正则表达式?
答案 0 :(得分:3)
使用python的regex
模块,你可以拥有这个(相当复杂!)正则表达式:
(?:^\s*|\G)\s*(?:,\s*)?\K(\b\d{1,2}\b)(?=(?:\s*(?:,\s*)?\b\d{1,2}\b)*$)
(?:^\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)
答案 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*)*$
。请注意,要捕获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
和可选的无限空间s*
。该组可以发生可选的无限次,因此*
后面跟着$
,即字符串的结尾。
答案 2 :(得分:1)
您可以修改正则表达式
^\s*\b\d{1,2}\b(?:\s*\,?\s*\b\d{1,2}\b)*\s*$
参见演示。
答案 3 :(得分: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*$
(?:语法用于防止该组被捕获