意图
若要创建一个正则表达式,在有任何字符、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 matchRegex解决方案
Interpretation:任何非中文字符都可以。前瞻性设置,至少一次
(?![\u4E00-\u9FFF]|[\u3400-\u4BDF]|[\u20000-\u2A6DF]|[\u2A700-\u2B73F]|[\u2B740-\u2B81F]|[\u2B820-\u2CEAF]|[\uF900-\uFAFF]|[\u2F800-\u2FA1F])+Interpretation:来自任意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匹配
谢谢你抽出时间!
发布于 2020-12-28 04:37:14
首先,\u20000并不是你所认为的那样。因为\u序列必须有4位长,这是指U+2000和数字0。对于0xFFFF以上的字符,Python提供\U,它必须后面紧跟8位数字(例如\U00020000)。
第二,
[A-B]|[C-D]|...最好写成
[A-BC-D...]通过上述修正和上述简化,我们有以下几点:
[\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属性与您要匹配的字符是紧密匹配的。我会让你决定它是否适合你。
is_just_han = regex.search("^\p{Han}*$", str)
is_just_han = regex.search("\P{Han}", str)https://stackoverflow.com/questions/65473021
复制相似问题