有没有更好的正则表达式来计算中文字母的数量并同时排除一些字符?

Is there better regex to calculate the number of Chinese letters and exclude some characters at the same time?

我想计算汉字的个数,排除一些字符,例如

s_l = ['康熙十年','咸丰三年','民国二十二年']

需要免除‘年’字,所以

s_l = ['康熙十年','咸丰三年','民国二十二年']
for idx, str_item in enumerate(s_l):
    res = len(re.findall(r'[\u4E00-\u9FFF]', str_item))-len(re.findall(r'[年]', str_item))
    print(res)

现在,我可以将这两个正则表达式合并为一个吗?如果是这样,如何?不好直接组合到

re.findall(r'[\u4E00-\u9FFF]((?![年]).)*$', str_item)

没有正则表达式:

exclude_list = list('?!.)ab')
for str_item in s_l:
    res = len([i for i in str_item if i not in exclude_list])
    print(f"{str_item}: {res}")

输出:

abc)def: 4
aaabbbccc: 3
dfg: 3

使用正则表达式:

for str_item in s_l:
    res = len(re.findall(r'[^?!.)ab]', str_item))
    print(res)

pip install regex再用

会简单很多
import regex
s_l = ['康熙十年','咸丰三年','民国二十二年', 'abc']
rx = regex.compile(r'[^\P{Han}年]')
print( [len(rx.findall(s)) for s in s_l] )
# => [3, 3, 5, 0]

参见Python demo and the regex demo[^\P{Han}年] 正则表达式匹配 .

以外的任何中文字符

re 兼容模式是

(?!\u5E74)[\u2E80-\u2E99\u2E9B-\u2EF3\u2F00-\u2FD5\u3005\u3007\u3021-\u3029\u3038-\u303B\u3400-\u4DBF\u4E00-\u9FFF\uF900-\uFA6D\uFA70-\uFAD9\U00016FE2\U00016FE3\U00016FF0\U00016FF1\U00020000-\U0002A6DF\U0002A700-\U0002B738\U0002B740-\U0002B81D\U0002B820-\U0002CEA1\U0002CEB0-\U0002EBE0\U0002F800-\U0002FA1D\U00030000-\U0003134A]

regex demo. See the Python demo

import re
s_l = ['康熙十年','咸丰三年','民国二十二年', 'abc']
rx = re.compile(r'(?!\u5E74)[\u2E80-\u2E99\u2E9B-\u2EF3\u2F00-\u2FD5\u3005\u3007\u3021-\u3029\u3038-\u303B\u3400-\u4DBF\u4E00-\u9FFF\uF900-\uFA6D\uFA70-\uFAD9\U00016FE2\U00016FE3\U00016FF0\U00016FF1\U00020000-\U0002A6DF\U0002A700-\U0002B738\U0002B740-\U0002B81D\U0002B820-\U0002CEA1\U0002CEB0-\U0002EBE0\U0002F800-\U0002FA1D\U00030000-\U0003134A]')
print( [len(rx.findall(s)) for s in s_l] )
# => [3, 3, 5, 0]