用于从01000到95999的整数组合的Python正则表达式

2024-06-01 00:59:44 发布

您现在位置:Python中文网/ 问答频道 /正文

我一直在尝试构建一个正则表达式来匹配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]{3}$):仅当我输入的数字只有5位时才匹配。你知道吗

我的最终版本是: ^((0[1-9]{1})|([1-8]{1}[0-9]{1})|9[0-5]{1})[0-9]{3}$ 这个“分解”了[0,9]{3}端部。你知道吗

Debuggex Demo


Tags: 代码版本区域编辑demo数字部门zipcode
3条回答

您也可以使用类似\d{5}的正则表达式来首先匹配00000到100000

首先匹配所有内容,然后通过检查字符串作为整数是否在1000和96000之间来验证每个匹配。你知道吗

首先,我认为你的例子中有一些拼写错误。
(代替[1,9]可能应该是[1-9]

除此之外,唯一(微小)的改进是不重复结束模式。你知道吗

(0[1-9]|[1-8][0-9]|9[0-5])[0-9]{3}$

您可以(/应该/必须)在the official list of french postal codes上测试正则表达式。你知道吗

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!

相关问题 更多 >