如何在Python中检测UTF-8字符串中的左右方向标记及括号方向
检测UTF-8字符串中括号的RTL/LTR属性及方向标记
直接操作Unicode字符就能实现你的需求,Python里的字符串本身就是Unicode序列,不用额外编码解码。下面是具体实现:
核心思路
- RLM(右到左标记)和LRM(左到右标记)对应固定的Unicode码点,直接判断字符的码点即可识别。
- 括号的RTL/LTR属性可以通过字符的双向排版类型判断,用
unicodedata模块就能获取这个属性。
完整代码
import unicodedata def is_right_to_left_mark(char): # RLM的Unicode码点:U+200F return ord(char) == 0x200F def is_left_to_right_mark(char): # LRM的Unicode码点:U+200E return ord(char) == 0x200E def get_bidi_type(char): try: return unicodedata.bidirectional(char) except ValueError: return "" # 测试用例,包含RTL括号、普通LTR括号、RLM/LRM标记 test_text = "测试文本:﴾RTL括号﴿ (LTR括号) \u200F---RLM标记---\u200E" for char in test_text: print(char) if is_right_to_left_mark(char): print("---RLM---") elif is_left_to_right_mark(char): print("---LRM---") # 判断括号的方向属性 bidi_type = get_bidi_type(char) if char in "()[]{}": print(f"普通LTR括号,双向类型: {bidi_type}") elif bidi_type in ('R', 'AL'): print(f"RTL字符,双向类型: {bidi_type},属于RTL类括号")
说明
- 不用对UTF-8字符串做编码解码操作,Python遍历字符串时拿到的每个
char都是完整的Unicode字符。 - RLM对应
\u200F,LRM对应\u200E,通过ord(char)获取字符的十进制码点,和十六进制的0x200F/0x200E对比就能识别。 - 用
unicodedata.bidirectional()可以获取字符的双向排版类型:- 'L' 代表LTR(从左到右)字符
- 'R'/'AL' 代表RTL(从右到左)字符
- 注意:普通LTR括号(如
())在RTL语境下排版时会反转显示,但它们本身的Unicode属性还是LTR,若要判断实际显示的开/闭状态,还需要结合文本的整体排版方向,不过如果只是判断字符本身的RTL/LTR属性,用上述方法足够。
内容的提问来源于stack exchange,提问作者Chana Drori
相关产品推荐
相关产品推荐

