用于从01000到95999的整数组合的Python正则表达式
我一直在尝试构建一个正则表达式来匹配python中的法语zipcodes 法语zipcode由部门代码(从01到95)和一个3位数的子区域(比如000到999)组成,子区域很大 我正在尝试这个:用于从01000到95999的整数组合的Python正则表达式,python,regex,Python,Regex,我一直在尝试构建一个正则表达式来匹配python中的法语zipcodes 法语zipcode由部门代码(从01到95)和一个3位数的子区域(比如000到999)组成,子区域很大 我正在尝试这个:0[1-9][0-9]{3}$|[1-8][0-9]{4}$|9[0-5][0-9]{3}$ 我把问题一分为三 01xxx到09xxx,然后1xxx到8xxx,然后90xxx到95xxx 有什么好办法吗 编辑: (0[1-9][0-9]{3}$)|([1-8][0-9]{4}$)|(9[0-5][0-9]
0[1-9][0-9]{3}$|[1-8][0-9]{4}$|9[0-5][0-9]{3}$
我把问题一分为三
01xxx到09xxx,然后1xxx到8xxx,然后90xxx到95xxx
有什么好办法吗
编辑:
(0[1-9][0-9]{3}$)|([1-8][0-9]{4}$)|(9[0-5][0-9]{3}$):这将仅在我的输入号码只有5位时匹配
我的最终版本是:
^((0[1-9]{1})|([1-8]{1}[0-9]{1})|9[0-5]{1})[0-9]{3}$
这个“因子化”了[0,9]{3}端
您也可以使用类似于
\d{5}
的正则表达式来首先匹配00000到100000
首先匹配所有内容,然后通过检查字符串作为整数是否在1000和96000之间来验证每个匹配。首先,我认为您的示例中存在一些输入错误。
(而不是
[1,9]
可能应该是[1-9]
)
除此之外,唯一(微小)的改进是不重复结束模式
(0[1-9]|[1-8][0-9]|9[0-5])[0-9]{3}$
您可以(/should/must)在上测试正则表达式
已经有人提议了
实际上,他们在那里有一个法国邮政编码的解决方案:)。逗号
,
在[1,9]
中。错误(打算[1-9]
?)我问这个问题是因为我正在使用法国最重要的邮政公司为一家销售网站处理发货事宜。问题是API需要我需要的特殊正则表达式。
import collections
codes = collections.defaultdict(list)
for line in open('code_postaux_v201410.csv'):
if not line[:1].isdigit():
continue
row = line.strip().split(';')
codes[row[2]]+= [row[1].strip()]
def test_failures(regexp):
r = re.compile(regexp)
return [code for code in codes if not r.match(code)]
len(test_failures(r'^((0[1-9]{1})|([1-8]{1}[0-9]{1})|9[0-5]{1})[0-9]{3}$'))
# 283 !
# not ideal, because it does not guarantee the input to be an existing one
len(test_failures(r'^0[1-9]|[1-8][0-9]|9[0-8]|2A|2B[0-9]{3}$'))
# but at least no miss!