2024-05-02 00:16:10 发布
网友
我只是在学习正则表达式,我在这里有点困惑。我有一个字符串,我想从中提取一个至少有4位数,最多有7位数的int。我试了一下:
>>> import re >>> teststring = 'abcd123efg123456' >>> re.match(r"[0-9]{4,7}$", teststring)
在我期待123456的地方,不幸的是这根本没有结果。有人能帮我一下吗?
@ExplosionPills是正确的,但是你的regex仍然有两个问题。
首先,$匹配字符串的结束。我猜您也希望能够在字符串中间提取一个int,例如abcd123456efg789来返回123456。要解决这个问题,您需要:
$
abcd123456efg789
123456
r"[0-9]{4,7}(?![0-9])" ^^^^^^^^^
增加的部分是一个负前瞻断言,意思是,“…后面没有更多的数字。”让我通过使用\d来简化它,尽管:
\d
r"\d{4,7}(?!\d)"
那更好。现在,第二个问题。在regex的左侧没有约束,因此给定一个类似abcd123efg123456789的字符串,您将实际匹配3456789。因此,您还需要一个负lookbehind断言:
abcd123efg123456789
3456789
r"(?<!\d)\d{4,7}(?!\d)"
您还可以使用:
re.findall(r"[0-9]{4,7}", teststring)
它将返回与正则表达式匹配的所有子字符串的列表,在您的示例中为['123456']
如果您只对第一个匹配的子字符串感兴趣,则可以将其编写为:
next(iter(re.findall(r"[0-9]{4,7}", teststring)), None)
.match只在字符串开始时与模式匹配。使用.search。
.match
.search
@ExplosionPills是正确的,但是你的regex仍然有两个问题。
首先,例如
$
匹配字符串的结束。我猜您也希望能够在字符串中间提取一个int,abcd123456efg789
来返回123456
。要解决这个问题,您需要:增加的部分是一个负前瞻断言,意思是,“…后面没有更多的数字。”让我通过使用
\d
来简化它,尽管:那更好。现在,第二个问题。在regex的左侧没有约束,因此给定一个类似
abcd123efg123456789
的字符串,您将实际匹配3456789
。因此,您还需要一个负lookbehind断言:您还可以使用:
它将返回与正则表达式匹配的所有子字符串的列表,在您的示例中为['123456']
如果您只对第一个匹配的子字符串感兴趣,则可以将其编写为:
.match
只在字符串开始时与模式匹配。使用.search
。相关问题 更多 >
编程相关推荐