【问题标题】:Regex to match 10 digit exactly with specific pattern正则表达式与特定模式完全匹配 10 位数字
【发布时间】:2018-01-29 18:07:23
【问题描述】:

假设我给出一个模式 123* 或 1234* ,我想匹配以该模式开头的任何 10 位数字。它应该正好有 10 位数字。

例子:

模式:123 应该匹配 1234567890 但不匹配 12345678

我尝试了这个正则表达式: (^(123)(\d{0,10}))(?(1)\d{10}).. 显然它不起作用。我试图将模式和剩余数字分组为两个不同的组。它匹配捕获组 (https://regex101.com/) 之后的 10 位数字。如何检查捕获的组是否正好是 10 位数字?或者这里有什么好的诀窍。请指导我。

【问题讨论】:

  • 如果您不解释现实生活场景并提供您遇到问题的代码,则很难提供帮助。也许你需要(?<!\d)123\d{7}(?!\d)
  • 我试图阻止以特定模式开头的电话号码。用户设置任何阻塞模式,如 123* 或 43* 等。所以我需要阻止与该模式匹配的所有入站和出站。但在挂断电话之前,我需要知道通话失败的原因是因为他们拨了错误的位数或阻塞模式以正确设置消息。 @randomir 的这个正则表达式 \b(?=123)\d{10}\b 似乎已经解决了这个问题。感谢您提供帮助解决该问题的想法。

标签: regex regex-greedy regex-group


【解决方案1】:

听起来像是positive lookahead 的案例:

(?=123)\d{10}

这将匹配任何正好 10 位数字的序列,但前提是必须以 123 为前缀。测试一下here

前缀1234

(?=1234)\d{10}

当然,如果您预先知道前缀长度,则可以使用123\d{7},但是您必须在每次更改前缀时更改范围限制(例如:1234\d{6})。


此外,为确保仅捕获 10 位数字的孤立组,您可能希望使用(零长度)字边界 \b 锚定上述表达式:

\b(?=123)\d{10}\b

或者,如果您的序列出现在单词的内部,您可能希望在\d 上使用否定的lookbehind 和lookahead(正如@Wiktor 在cmets 中所建议的那样):

(?<!\d)(?=123)\d{10}(?!\d)

【讨论】:

  • (?=123)\d{10} = 123\d{7}
  • 当然,但据我了解,OP 想要改变前缀,在这种情况下使用前瞻更容易,因为正则表达式的其余部分不会改变。我已添加说明。
  • 可以,但不能保证你只会匹配一个10位数字,你可以匹配12345678901234567中的1234567890
  • 问题在这一点上还不清楚,但你是对的。我现在也在我的回答中提到了这个案例。
【解决方案2】:

我会保持简单:

import re

text = "1234567890"

match = re.search("^123\d{7}$|^1111\d{6}$", text)
if match:
    print ("matched")

只需将您的 2 个模式放入其中,就可以了!请注意,123* 会捕获 1234*,所以我以 1111\d{6} 为例

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多