regex - 正则表达式匹配字符串中与字母相等的数字计数
问题描述
只需检查是否可以使用正则表达式来验证/检查一串字母数字,以确保它具有相同的数字和字母总数。
例如,
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]*$
,但它会找到所有至少有一个字母和一个数字的字符串。
解决方案
只是把我的两分钱放进去:你可以给自己写一个小解析器,例如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'
推荐阅读
- python - Python 的 html.parser 无法检索网页的某些部分(选项卡式面板的内容)
- c# - 向 Startup.cs 添加大量存储库会导致任何问题吗?
- spring - Spring框架库
- sql - 如果未找到状态,如何查询历史表?
- sql - 带有 XML 字段的 UPDATE SELECT 语句
- php - PHP 标头重定向到 $page2 变量
- scala - Spark 无法用奇怪的三引号解析 csv
- php - 我应该使用哪个索引来混合 WHERE 和 ORDER BY
- django - Django 管理站点重定向到错误的位置
- c# - 一次请求后的 Google Api 方向 OVER_QUERY_LIMIT