求这样的正则匹配模型

2017-01-04 15:59:56 +08:00
 cfczdws
现有一段文本,里面可能包含一个数字(位数不知,位置不知),现在的需求是只当是 6 位数字的情况下才匹配。

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

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

继续请教下:[\D^] 和 (\D|^) 有什么区别吗?我测试时,用前者,最文本最前面是数字就不能匹配,而用后者就没有限制。
DiamondbacK
2017-01-05 00:10:06 +08:00
@cfczdws
读一读正则表达式文档中的 '[]' 表达式部分,了解一下 '[]' 里的 '^' 的含义。
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
2017-01-05 22:01:21 +08:00
@LigeLaige (\D|^) 和 (\D|$) 是不可或缺的,否则匹配不了开头和结尾出现的六位数字。

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

@cfczdws 恩,其实我回复的时候一时间没想起来 [^\d] 等同于 \D 而已。
cfczdws
2017-01-06 00:16:58 +08:00
@DiamondbacK
@ipwx
哦,之前没想到,原来[ ]里^是非的意思;)

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/332193

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX