首页 > 解决方案 > 正则表达式匹配字符串中与字母相等的数字计数

问题描述

只需检查是否可以使用正则表达式来验证/检查一串字母数字,以确保它具有相同的数字和字母总数。

例如,

7868HGCD (4 digits, 4 alphabets)
87429AJIGH (5 digits, 5 alphabets)
8A2K9H7A (digits ,alphabets alternately)
1H2B3C7D9K8L

..而这样的例子不胜枚举。

只要字符串中的数字和字母总数相等,任何语法都可以。我试过^([a-zA-Z0-9 -]+)$which 接受字母数字,但我不知道可以使用什么正则表达式来检查(总数字 = 总字母)

使用前瞻^(?=[^\s]?[0-9])(?=[^\s]?[a-zA-Z])[a-zA-Z0-9]*$,但它会找到所有至少有一个字母和一个数字的字符串。

标签: regex

解决方案


只是把我的两分钱放进去:你可以给自己写一个小解析器,例如Python

from parsimonious.grammar import Grammar
from parsimonious.nodes import NodeVisitor
from parsimonious.exceptions import ParseError

grammar = Grammar(
    r"""
    term        = (digit / alpha)+
    digit       = ~"\d"
    alpha       = ~"[a-zA-Z]"
    """)

class AlnumCounter(NodeVisitor):
    def __init__(self):
        self.reset()

    def reset(self):
        self.abc = 0
        self.digits = 0

    def visit_digit(self, node, children):
        self.digits += 1

    def visit_alpha(self, node, children):
        self.abc += 1

    def visit_term(self, node, children):
        return (self.digits, self.abc)

    def generic_visit(self, node, visited_children):
        return node or visited_children

# list of strings
strings = ['7868HGCD', '87429AJIGH', '8A2K9H7A', '1H2B3C7D9K8L', 'somegarbage', 'parsing error']

alnum = AlnumCounter()
for string in strings:
    try:
        tree = grammar.parse(string)
        out = alnum.visit(tree)

        if out[0] == out[1]:
            print("Correct format: {}".format(string))
        else:
            print("Not correct: {}".format(string))

    except ParseError:
        print("Encountered strange characters within '{}'".format(string))

    finally:
        # reset the counters
        alnum.reset()

这将产生

Correct format: 7868HGCD
Correct format: 87429AJIGH
Correct format: 8A2K9H7A
Correct format: 1H2B3C7D9K8L
Not correct: somegarbage
Encountered strange characters within 'parsing error'

推荐阅读