Python Regex-负前瞻,用于将字符串与任何非中文UTF字符匹配 意图
创建一个正则表达式,该正则表达式在存在任何字符(ASCII、Unicode或其他字符)时创建匹配,这些字符不属于任何有效的汉字UTF-8范围。匹配本身并不重要,而是存在非中文字符。请注意,UTF-8字符集中还存在罕见的、未使用的汉字。当不存在匹配项时,该函数返回None,从而表明传入的字符串是调用方函数的纯Unicode中文字符串 代码 Python 3.8Python Regex-负前瞻,用于将字符串与任何非中文UTF字符匹配 意图,python,python-3.x,regex,regex-lookarounds,Python,Python 3.x,Regex,Regex Lookarounds,创建一个正则表达式,该正则表达式在存在任何字符(ASCII、Unicode或其他字符)时创建匹配,这些字符不属于任何有效的汉字UTF-8范围。匹配本身并不重要,而是存在非中文字符。请注意,UTF-8字符集中还存在罕见的、未使用的汉字。当不存在匹配项时,该函数返回None,从而表明传入的字符串是调用方函数的纯Unicode中文字符串 代码 Python 3.8 chineseRegexSet = "[\u4E00-\u9FFF]|[\u3400-\u4BDF]|[\u20000-\u2A
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]+)*
测试用例
案例
预期结果
大家好代码>0个匹配项
00你是谁代码>>=1匹配项
s%%2
>=1匹配
你Пццццц
>=1匹配
谢谢您抽出时间首先,\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]
有两种解决问题的方法:
字符串是否仅包含该类中的字符
是_just_han=re.search(“^[…]*$”,str)还是regex.search
字符串是否包含该类之外的字符
is_just_han=not re.search(“[^…]”,str)#或regex.search
如果使用模块而不是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)
首先,\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]
有两种解决问题的方法:
字符串是否仅包含该类中的字符
是_just_han=re.search(“^[…]*$”,str)还是regex.search
字符串是否包含该类之外的字符
is_just_han=not re.search(“[^…]”,str)#或regex.search
如果使用模块而不是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)
关于\P{Script=Han}
,我必须做一些广泛的测试,因为我正在解析古代汉语词典,Python正则表达式的加速器可能不支持其中一些范围。虽然我喜欢表达式的简洁,但一旦我弄清楚正则表达式,我一定会尝试一下。使用适当的库,未通过检查的正则表达式之间的差异为.04%,这超过了可接受的错误/差异容忍度。非常感谢@ikegami!关于\P{Script=Han}
,我必须做一些广泛的测试,因为我正在解析古代汉语词典,Python正则表达式的加速器可能不支持其中一些范围。虽然我喜欢表达式的简洁,但一旦我弄清楚正则表达式,我一定会尝试一下。使用适当的库,未通过检查的正则表达式之间的差异为.04%,这超过了可接受的错误/差异容忍度。非常感谢@ikegami!