You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

阿拉伯语文本预处理:re.sub正则丢失虚词“و”问题排查

解决阿拉伯语虚词“و”与单词分隔的正则表达式问题

问题根源

你使用的正则表达式r'\sو(\w+)'中,默认的\w仅匹配ASCII字母、数字和下划线,完全无法识别阿拉伯语字符。这导致正则无法匹配“و”后的阿拉伯语单词,不仅达不到分隔效果,甚至可能因其他操作的间接影响导致“و”被误删。

修复方案

1. 替换\w为阿拉伯语专属字符类

直接指定阿拉伯语字母的Unicode范围,确保能正确匹配后续单词:

# 匹配"空格+و+阿拉伯语单词",替换为"空格+و+空格+单词"
text = re.sub(r'(\s)و([\u0621-\u064A]+)', r'\1و \2', text)
  • [\u0621-\u064A]覆盖了所有标准阿拉伯语字母(从ء到ي),如果需要包含特殊阿拉伯语字符,可改用更宽泛的[\u0600-\u06FF]。

2. 启用Unicode匹配模式

在re.sub中添加re.UNICODE标志,让\w支持匹配所有Unicode字母数字:

text = re.sub(r'\sو(\w+)', r' و \1', text, flags=re.UNICODE)

3. 处理“و”与前置单词无空格的场景

如果文本中存在“موزةوتفاحة”这类“و”直接跟在单词后的情况,添加额外正则处理:

# 匹配"非阿拉伯语字符+و+阿拉伯语单词",避免拆分本身含"و"的单词(如"واحد")
text = re.sub(r'(?<![\u0621-\u064A])و([\u0621-\u064A]+)', r'و \1', text)
  • (?<![\u0621-\u064A])是反向断言,确保“و”前面不是阿拉伯语字母,防止误拆分原生包含“و”的单词。

修改后的完整normalize_arabic方法

def normalize_arabic(self, text):
    text = re.sub("[إأآاٱ]", "ا", text)
    text = re.sub("ى", "ي", text)
    #text = re.sub("ؤ", "ء", text)
    #text = re.sub("ئ", "ء", text)
    text = re.sub("ة", "ه", text)  # 替换تاء مربوطة为هاء
    text = re.sub("گ", "ك", text)
    # 移除ال冠词时也添加Unicode标志,确保正确匹配阿拉伯语单词
    text = re.sub(r'\bال(\w\w+)', r'\1', text, flags=re.UNICODE)
    # 处理带空格的"و+单词"场景
    text = re.sub(r'(\s)و([\u0621-\u064A]+)', r'\1و \2', text)
    # 处理无空格的"و+单词"场景
    text = re.sub(r'(?<![\u0621-\u064A])و([\u0621-\u064A]+)', r'و \1', text)
    text = re.sub("\u0640", '', text)  # 移除تطويل
    return text

内容的提问来源于stack exchange,提问作者Rahaf Almgheed

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 21:32:03