正则表达式条件匹配

时间:2015-05-31 19:27:20

标签: python regex

我正在尝试使用re.findall来查找此模式:

01-234-5678
regex:
(\b\d{2}(?P<separator>[-:\s]?)\d{2}(?P=separator)\d{3}(?P=separator)\d{3}(?:(?P=separator)\d{4})?,?\.?\b)

然而,有些情况已经缩短为01-234-5而不是01-234-0005,而后四位数是3个零后跟非零数字。

由于格式似乎没有任何统一性,我不得不考虑几个不同的分隔符或者根本不考虑。幸运的是,当我使用了一些分离器时,我才注意到这种缩短......

是否可以使用正则表达式条件来检查分隔符是否存在(不是空字符串),然后检查缩短的变化?

所以,像if separator != '': re.findall(r'(\b\d{2}(?P<separator>[-:\s]?)\d{3}(?P=separator)(\d{4}|\d{1})\.?\b)', text)

或者我唯一的选择是包含所有可能不正确的6位数字模式然后检查python的分隔符?

2 个答案:

答案 0 :(得分:2)

如果您希望最后一组数字“一个或四个数字”,请尝试:

>>> import re
>>> example = "This has one pattern that you're expecting, 01-234-5678, and another that maybe you aren't: 23:456:7"
>>> pattern = re.compile(r'\b(\d{2}(?P<sep>[-:\s]?)\d{3}(?P=sep)\d(?:\d{3})?)\b')
>>> pattern.findall(example)
[('01-234-5678', '-'), ('23:456:7', ':')]

模式的最后一部分\d(?:\d{3})?)表示一个数字,可选地后跟另外三个数字(即一个或四个)。请注意,您不需要包含可选的句号或逗号,它们已被\b涵盖。

鉴于您想要捕获没有分隔符并且最后一部分是单个数字的情况,您可以单独处理该情况:

r'\b(\d{9}|\d{2}(?P<sep>[-:\s])\d{3}(?P=sep)\d(?:\d{3})?)\b'
#    ^ exactly nine digits
#         ^ or
#                             ^ sep not optional

请参阅this demo

答案 1 :(得分:0)

目前尚不清楚为什么要使用字边界,但我还没有看到你的数据。

否则你可以将整个内容缩短为:

re.compile(r'\d{2}(?P<separator>[-:\s]?)\d{3}(?P=separator)\d{1,4}')

请注意\ d {1,4}匹配一个包含1,2,3或4位数的字符串

如果没有分隔符,例如当您使用匹配0或1次的[-:\s]?时,“012340008”将匹配上面的正则表达式。

HTH