我一直在为这个尴尬的长时间挣扎,所以我来这里寻求帮助。
我希望匹配所有带有数字的字符串,然后是可选的破折号,后跟更多的数字。
示例:
#Match
1
34-1
2-5-2
15-2-3-309-1
# Don't match
1--
--
#$@%^#$@#
dafadf
10-asdf-1
-12-1-
我从这个正则表达式开始(一个或多个数字,后跟可选的破折号和一个或多个数字):
\d+(-\d+)*
那不起作用。然后我尝试围绕\d
:
(\d)+(-(\d)+)*
这也不起作用。有人可以帮帮我吗?
答案 0 :(得分:4)
您可以使用:
^(\d+(?:$|(?:-\d+)+))
或者,相同正则表达式的Debugex版本:
^(\d+(?:$|(?:-\d+)+))
也许是一个更好的选择,因为它固定在两端:
^(\d+(?:-\d+)*)$
确保使用正确的标志和重新方法:
import re
tgt='''
#Match
1
34-1
2-5-2
15-2-3-309-1
# Don't match
1--
--
#$@%^#$@#
dafadf
10-asdf-1
-12-1-
'''
print re.findall(r'^(\d+(?:-\d+)*)$', tgt, re.M)
# ['1', '34-1', '2-5-2', '15-2-3-309-1']
答案 1 :(得分:1)
这是我构建的正则表达式,涵盖了所有正面测试用例;规则集是python:
^(?=\d)([-\d]+)*(?<=\d)$
基本上,有一个先行可以确保它在开始时以数字开头。有一个lookbehind以确保它以数字结尾,并且中间的每个捕获组严格由数字和连字符组成。
答案 2 :(得分:1)
答案 3 :(得分:1)
您的原始正则表达式似乎适用于您为示例提供的输入,但有一点需要注意:您需要使用line-begin(^)和line-end($)锚点或指定全行匹配而不是字符串搜索,它将隐式使用^和$来封装你的正则表达式。 (即,Python中的re.match()与re.search())
其他示例都可以正常工作,但^ $正是这样做的。
干杯。