11

我只是在学习正则表达式,我在这里有点困惑。我有一个字符串,我想从中提取一个至少 4 位,最多 7 位的 int。我尝试如下:

>>> import re
>>> teststring = 'abcd123efg123456'
>>> re.match(r"[0-9]{4,7}$", teststring)

在我期待 123456 的地方,不幸的是,这根本没有结果。有人可以在这里帮我一点吗?

4

3 回答 3

20

@ExplosionPills 是正确的,但是您的正则表达式仍然存在两个问题。

首先,$匹配字符串的结尾。我猜你也希望能够在字符串中间提取一个 int ,例如 abcd123456efg789return 123456。为了解决这个问题,你想要这个:

r"[0-9]{4,7}(?![0-9])"
            ^^^^^^^^^

添加的部分是一个否定的前瞻断言,意思是“......后面没有任何数字”。让我通过使用来简化它\d

r"\d{4,7}(?!\d)"

这样更好。现在,第二个问题。您对正则表达式的左侧没有任何限制,因此给定一个类似 的字符串abcd123efg123456789,您实际上会匹配3456789。因此,您还需要一个否定的后向断言

r"(?<!\d)\d{4,7}(?!\d)"
于 2013-05-02T22:21:18.760 回答
9

.match仅当字符串以模式开头时才会匹配。使用.search.

于 2013-05-02T22:12:38.777 回答
3

您还可以使用:

re.findall(r"[0-9]{4,7}", teststring)

在您的情况下,这将返回与您的正则表达式匹配的所有子字符串的列表 ['123456']

如果您只对第一个匹配的子字符串感兴趣,那么您可以这样写:

next(iter(re.findall(r"[0-9]{4,7}", teststring)), None)
于 2013-05-02T22:27:07.710 回答