V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
cfczdws
V2EX  ›  编程

求这样的正则匹配模型

  •  
  •   cfczdws · 2017-01-04 15:59:56 +08:00 via Android · 3299 次点击
    这是一个创建于 2669 天前的主题,其中的信息可能已经有所发展或是发生改变。
    现有一段文本,里面可能包含一个数字(位数不知,位置不知),现在的需求是只当是 6 位数字的情况下才匹配。

    文本内容可能情况有: 12345678abc(错误), abc123(错误), 123456abc(正确)。

    请问该怎么写模型啊?
    13 条回复    2017-01-06 00:16:58 +08:00
    ywpg
        1
    ywpg  
       2017-01-04 16:55:03 +08:00
    如果是连续数字,请查阅文档。
    如果数字可以不连续,建议不用正则处理。
    enclave
        2
    enclave  
       2017-01-04 18:28:10 +08:00 via iPhone
    \d{6}
    enclave
        3
    enclave  
       2017-01-04 18:29:43 +08:00 via iPhone
    .*\d{6}.*
    ipwx
        4
    ipwx  
       2017-01-04 18:44:35 +08:00
    (?<=[^\d]|^)\d{6}(?=[^\d]|$)
    imn1
        5
    imn1  
       2017-01-04 19:07:11 +08:00
    估计是空格分开吧
    \S*\d{6}\S*
    LigeLaige
        6
    LigeLaige  
       2017-01-04 19:13:01 +08:00
    \D+\d{6}\D+
    trcnkq
        7
    trcnkq  
       2017-01-04 19:25:51 +08:00
    \D*\d{6}\D*
    cfczdws
        8
    cfczdws  
    OP
       2017-01-04 22:14:04 +08:00
    @enclave
    @imn1
    @LigeLaige
    @trcnkq
    注意位数啊,这样, abc12345678def 也匹配到了
    cfczdws
        9
    cfczdws  
    OP
       2017-01-04 22:32:39 +08:00
    @ipwx 谢谢,我后来用了(\D|^)(\d{6})(\D|$),用起来没问题。

    继续请教下:[\D^] 和 (\D|^) 有什么区别吗?我测试时,用前者,最文本最前面是数字就不能匹配,而用后者就没有限制。
    DiamondbacK
        10
    DiamondbacK  
       2017-01-05 00:10:06 +08:00
    @cfczdws
    读一读正则表达式文档中的 '[]' 表达式部分,了解一下 '[]' 里的 '^' 的含义。
    LigeLaige
        11
    LigeLaige  
       2017-01-05 10:51:01 +08:00
    @cfczdws

    import re
    pattern = re.compile(r'\D+\d{6}\D+')
    result = pattern.findall('abc12345678def')
    # result is []

    不知道你是否仔细看了大家的答案!
    如果你需要提取这个数字,则可以写成
    r'\D+(\d{6})\D+'
    它会保持在正则引擎的内建变量 \1 中
    ipwx
        12
    ipwx  
       2017-01-05 22:01:21 +08:00
    @LigeLaige (\D|^) 和 (\D|$) 是不可或缺的,否则匹配不了开头和结尾出现的六位数字。

    另外我平时觉得用前向断言更方便,毕竟扔掉了这个组, re.findall 可以把所有匹配项直接一次性拿出来。当然对于这个例子可能没什么区别。

    @cfczdws 恩,其实我回复的时候一时间没想起来 [^\d] 等同于 \D 而已。
    cfczdws
        13
    cfczdws  
    OP
       2017-01-06 00:16:58 +08:00 via Android
    @DiamondbacK
    @ipwx
    哦,之前没想到,原来[ ]里^是非的意思;)
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2785 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 05:46 · PVG 13:46 · LAX 22:46 · JFK 01:46
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.