Python regex用于数字行和可选的短划线+数字。为什么不匹配?

2024-09-29 21:23:16 发布

您现在位置:Python中文网/ 问答频道 /正文

我在这件事上挣扎了很长时间,所以我来这里寻求帮助。在

我想匹配所有有一个数字后跟一个可选的短划线和更多数字的字符串。在

示例:

#Match
1
34-1
2-5-2
15-2-3-309-1

# Don't match
1--
--
#$@%^#$@#
dafadf
10-asdf-1
-12-1-

我从这个regex开始(一个或多个数字,后跟一个破折号和一个或多个数字):

^{pr2}$

那没用。然后我试着在\d周围加上括号:

(\d)+(-(\d)+)*

那也没用。有人能帮我吗?在


Tags: 字符串示例match数字regex括号don破折号
3条回答

这应该做到:

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

工作正则表达式示例:

http://regex101.com/r/sD0oL7

下面是我构建的一个regex,它覆盖了所有的阳性测试用例;规则集是python:

^(?=\d)([-\d]+)*(?<=\d)$

Regular expression visualization

Debuggex Demo

基本上,有一个前瞻性,以确保它从一个数字开始。还有一个lookbehind确保它也以一个数字结尾,中间的每个捕获组都严格由数字和连字符组成。在

您可以使用:

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

See it work here。在

或者,同一regex的Debugex版本:

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

Regular expression visualization

Debuggex Demo

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

^{3}$

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']

相关问题 更多 >

    热门问题