创建一个正则表达式,该正则表达式在存在任何字符(ASCII、Unicode或其他字符)时创建匹配,这些字符不属于任何有效的汉字UTF-8范围。匹配本身并不重要,而是存在非中文字符。请注意,UTF-8字符集中还存在罕见的、未使用的汉字。当不存在匹配项时,该函数返回None,从而表明传入的字符串是调用方函数的纯Unicode中文字符串
Python 3.8
chineseRegexSet = "[\u4E00-\u9FFF]|[\u3400-\u4BDF]|[\u20000-\u2A6DF]|[\u2A700-\u2B73F]|[\u2B740-\u2B81F]|[\u2B820-\u2CEAF]|[\uF900-\uFAFF]|[\u2F800-\u2FA1F]"
def ContainsNonChineseCharacters(hanziWord):
#negative lookahead
match = search("(?!" + chineseRegexSet + ")+", hanziWord)
if match:
if _DEBUG:
PrintDebugError(hanziWord)
PrintDebugError(hanziWord, utfEncode=True)
else:
_LOGGER.debug(hanziWord)
if _DEBUG:
PrintDebug(hanziWord)
PrintDebug(hanziWord, utfEncode=True)
return match
解释:任何非汉字负号。前瞻设置,至少一次
(?![\u4E00-\u9FFF]|[\u3400-\u4BDF]|[\u20000-\u2A6DF]|[\u2A700-\u2B73F]|[\u2B740-\u2B81F]|[\u2B820-\u2CEAF]|[\uF900-\uFAFF]|[\u2F800-\u2FA1F])+
解释:任何UTF集合中的任何非单数汉字
(?![\u4E00-\u9FFF]+|[\u3400-\u4BDF]+|[\u20000-\u2A6DF]+|[\u2A700-\u2B73F]+|[\u2B740-\u2B81F]+|[\u2B820-\u2CEAF]+|[\uF900-\uFAFF]+|[\u2F800-\u2FA1F]+)*
Case
预期结果
大家好
0个匹配项
00你是谁
>=1场比赛
s%%2
>=1场比赛
你Привет
>=1场比赛
谢谢您抽出时间强>
首先,
\u20000
并不意味着你认为它有什么作用。因为\u
序列的长度必须正好是4位,这是指U+2000
和数字0
。对于0xFFFF以上的字符,Python提供\U
,后面必须紧跟8位数字(例如\U00020000
)第二,
最好写为
通过上述修复和上述简化,我们有:
[\u3400-\u4BDF\u4E00-\u9FFF\uF900-\uFAFF\U00020000-\U0002A6DF\U0002A700-\U0002B73F\U0002B740-\U0002B81F\U0002B820-\U0002CEAF\U0002F800-\U0002FA1F]
有两种解决问题的方法:
字符串是否仅包含该类中的字符
字符串是否包含该类之外的字符
如果使用regex模块而不是re模块,则可以访问
\p{Han}
(简称\p{Script=Han}
)及其否定\P{Han}
(简称\P{Script=Han}
)。此Unicode属性与您尝试匹配的字符非常匹配。我会让你决定它是否适合你相关问题 更多 >
编程相关推荐