数値とハイフンとカンマ以外が含まれないか

投稿者: | 2023-03-05
  • ID検索用のINPUTを作成する際、「123」「1-100」「1,3,45」などで1つ、連続、複数で検索したかった
  • 最初はisdigit()などで組んでみたものの条件が複雑になりすぎた
  • よって正規表現でそれ以外の文字が含まれればNGとしてみた
  • ただし、桁数の正誤は判断できないため、メイン側で判別が必要
a_dict = dict(
    ok_chr1 = '345',
    ok_chr1_random_sorted = '1,3,5,100,600',
    ok_chr1_random_no_soretd = '4,1,89,2',
    ok_chr1_random_same = '1,5,3,5,9',
    ok_chr2 = '345-340',
    ok_chr2_same = '235-235',
    ok_chr3_mixed = '110-109,345',
    ng_chr1 = '235',
    ng_chr2 = '231a',
    ng_chr3 = '23あああ',
    ng_chr4 = '234ー236',
    ng_chr5 = '235-256',
    ng_chr6_reverse = '110-109',
    ng_chr7_space = '110 ',
    ng_chr8_space = '110, 100',

)

def is_correct_chr_in_set_id(regex_p, chrs):
    chrs = str(chrs)
    split_string_list = []
    for s in [s for s in list(chrs)]:
        is_correct_chr = regex_p.search(s)
        split_string_list.append(is_correct_chr)
    return all(split_string_list)

# 任意の非数字とマッチ
p = re.compile(r"[0-9]|-|,") 

for chrs in a_dict.values():
    is_correct = is_correct_chr_in_set_id(p, chrs)
    print(f'{chrs}: {is_correct}')

>> 345: True
>> 1,3,5,100,600: True
>> 4,1,89,2: True
>> 1,5,3,5,9: True
>> 345-340: True
>> 235-235: True
>> 110-109,345: True
>> 235: False
>> 231a: False
>> 23あああ: False
>> 234ー236: False
>> 235-256: False
>> 110-109: True
>> 110 : False
>> 110, 100: False