我正在尝试使用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的分隔符?
答案 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