【问题标题】:Python regex for int with at least 4 digits至少 4 位 int 的 Python 正则表达式
【发布时间】:2013-04-27 05:52:32
【问题描述】:

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

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

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

【问题讨论】:

  • 你不会期待123456吗?
  • @JonClements - 啊,是的。你说的对。打扰一下。我更正了。

标签: python regex int match


【解决方案1】:

你也可以使用:

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

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

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

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

【讨论】:

  • 我觉得你需要去掉$,否则只会找到最后一个。
【解决方案2】:

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

首先,$ 匹配字符串的 end。我猜您也希望能够在字符串中间提取一个 int,例如 abcd123456efg789 以返回 123456。要解决这个问题,你需要这样:

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

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

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

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

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

【讨论】:

  • 谢谢。奇迹般有效!我还有一个问题;假设我现在想找到隐藏在字符串中的所有类似于年份的数字。这意味着它恰好由 4 位数字组成,其中前两位是 19 或 20(我的应用程序中的年份可以从 1950 年代到 2050 年)。你也知道我怎么能找到这些数字吗?我想我需要 findall() 来解决这个问题,但是我如何匹配 4 位数字,前两位是 19 或 20?
  • 简单。 r"(?&lt;!\d)(?:19[5-9]\d|20[0-4]\d|2050)(?!\d)"。玩得开心:-)
  • 我想,如果你不熟悉这些结构,我应该解释一些事情。忽略(?: ... );假装它是一个群组( ... )| 是交替运算符,例如“This OR this OR this”。
  • 谢谢!该|我从 php 中知道的构造,但我想知道实际上是 ?: 和开头的 <..>
  • (?: ... ) 只是将一个组变成一个非捕获组。您知道( ... ) 通常是如何捕获 到变量之间的内容,例如$1$2 等? ?: 只是阻止了这种情况。当您实际上不打算使用捕获时,最好是明确的。开头的 &lt; 只是否定后向断言的语法:(?&lt;! ... ); &lt; 应该看起来像一个指向后面的箭头。
【解决方案3】:

.match 只会在字符串 开头的模式下匹配。使用.search

【讨论】:

    猜你喜欢
    • 2013-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-31
    • 1970-01-01
    相关资源
    最近更新 更多