希伯来语和英语字符串之间的分隔

Separating between Hebrew and English strings

所以我有这个庞大的希伯来语和英语字符串列表,我只想从中提取希伯来语字符串,但找不到适用于希伯来语的正则表达式示例。

我试过比较每个字符的愚蠢方法:

import string
data = []
for s in slist:
    found = False
    for c in string.ascii_letters:
        if c in s:
            found = True
    if not found:
        data.append(s)

它确实有效,但它当然很慢而且我的列表很大。 取而代之的是,我尝试仅将字符串的第一个字母与 string.ascii_letters 进行比较,这要快得多,但它只会过滤掉那些以英文字母开头的字母,并在其中保留 "mixed" 字符串。我只想要 "pure" 希伯来语。

我相信这可以做得更好...有人帮忙吗?

P.S:我更喜欢在 python 程序中执行此操作,但是执行相同操作的 grep 命令也会有所帮助

这个应该有效:

import re
data = [s for s in slist if re.match('^[a-zA-Z ]+$', s)]

这将选择所有由小写和大写英文字母和空格组成的字符串。如果允许字符串包含数字或标点符号,则应将允许的字符包含在正则表达式中。

编辑:刚刚注意到,它过滤掉了纯英文字符串,但您需要它以相反的方式进行。您可以试试这个:

data = [s for s in slist if not re.match('^.*[a-zA-Z].*$', s)]

这将丢弃任何包含至少一个英文字母的字符串。

要检查字符串是否包含任何 ASCII 字母(即非希伯来语),请使用:

re.search('[' + string.ascii_letters + ']', s)

如果这 returns 为真,则您的字符串不是纯希伯来语。

试试这个:

>>> import re
>>> filter(lambda x: re.match(r'^[^\w]+$',x),s)

另一种选择是创建希伯来语单词词典:

hebrew_words = {...}

然后遍历单词列表并将它们与本词典进行比较,忽略大小写。这将比其他方法快得多(O(n),其中 n 是您的单词列表的长度)。

缺点是您需要在某个地方获取全部或大部分希伯来语单词。我认为可以在网上以 csv 或其他形式找到它。解析并放入 python 字典。

但是,如果您需要非常频繁且非常快速地解析此类单词列表,这是有意义的。另一个问题是字典可能不包含所有希伯来语单词,因此不会给出完全正确的答案。

Python 具有广泛的 unicode 支持。这取决于你的要求。希伯来语单词是仅包含希伯来语字符和空格的单词,还是只是一个不包含拉丁字符的单词?无论哪种方式,您都可以直接这样做。只需创建标准集并测试成员资格。

请注意,测试集合中的成员资格比通过 string.ascii_letters 进行迭代要快得多。

请注意,我不会说希伯来语,所以我可能漏掉了一两个字母。

def is_hebrew(word):
    hebrew = set("א‎ב‎ג‎ד‎ה‎ו‎ז‎ח‎ט‎י‎כ‎ך‎ל‎מ‎נ‎ס‎  ע‎פ‎צ‎ק‎ר‎ש‎ת‎ם‎ן‎ף‎ץ"+string.whitespace)
    for char in word:
        if char not in hebrew:
            return False
    return True

def contains_latin(word):
    return any(char in set("abcdefghijklmnopqrstuvwxyz") for char in word.lower())
# a generator expression like this is a terser way of expressing the 
# above concept.

hebrew_words = [word for word in words if is_hebrew(word)]
non_latin words = [word for word in words if not contains_latin(word)]