Python正则表达式用于数字行和可选的短划线+数字。为什么不匹配?

时间:2014-02-24 16:45:14

标签: python regex

我一直在为这个尴尬的长时间挣扎,所以我来这里寻求帮助。

我希望匹配所有带有数字的字符串,然后是可选的破折号,后跟更多的数字。

示例:

#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)+)*

这也不起作用。有人可以帮帮我吗?

4 个答案:

答案 0 :(得分:4)

您可以使用:

^(\d+(?:$|(?:-\d+)+))

See it work here

或者,相同正则表达式的Debugex版本:

^(\d+(?:$|(?:-\d+)+))

Regular expression visualization

Debuggex Demo

也许是一个更好的选择,因为它固定在两端:

^(\d+(?:-\d+)*)$

Regular expression visualization

Debuggex Demo

确保使用正确的标志和重新方法:

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)$

Regular expression visualization

Debuggex Demo

基本上,有一个先行可以确保它在开始时以数字开头。有一个lookbehind以确保它以数字结尾,并且中间的每个捕获组严格由数字和连字符组成。

答案 2 :(得分:1)

这应该这样做:

^((?:\d+(?:-|$))+)$

工作正则表达式示例:

http://regex101.com/r/sD0oL7

答案 3 :(得分:1)

您的原始正则表达式似乎适用于您为示例提供的输入,但有一点需要注意:您需要使用line-begin(^)和line-end($)锚点或指定全行匹配而不是字符串搜索,它将隐式使用^和$来封装你的正则表达式。 (即,Python中的re.match()与re.search())

其他示例都可以正常工作,但^ $正是这样做的。

干杯。