将希伯来语和英语字符串分开

时间:2017-06-12 05:29:37

标签: python regex hebrew

所以我有希伯来语和英语的庞大字符串列表,我想从他们中只提取希伯来语中的字符串,但是找不到与希伯来语一起使用的正则表达式。

我尝试过比较每个角色的愚蠢方法:

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进行比较,速度要快得多,但它只过滤掉那些以英文字母开头的字母,并留下"混合"那里的字符串。我只想要那些纯粹的"希伯来语。

我确信这可以做得更好......帮助,有人吗?

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

5 个答案:

答案 0 :(得分:3)

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

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

如果返回true,则表示字符串不是纯希伯来语。

答案 1 :(得分:2)

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)]

答案 2 :(得分:1)

这个应该有效:

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)]

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

答案 3 :(得分:1)

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

hebrew_words = {...}

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

缺点是你需要在某处获得所有或大部分希伯来语单词。我认为可以在网上用csv或其他形式找到它。解析它并将其放入python字典中。

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

答案 4 :(得分:0)

试试这个:

tscontig
相关问题