Python 分离希伯来语和英语字符串

Python 分离希伯来语和英语字符串,python,regex,hebrew,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.appe

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

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

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_字母
,这要快得多,但它只过滤掉以英文字母开头的字母,并将“混合”字符串保留在其中。我只想要那些“纯”希伯来语的

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

注:我更喜欢在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)]
这将丢弃至少包含一个英文字母的任何字符串。

此字符串应适用于:

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字母(即非希伯来语),请使用:


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

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

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

试试这个:

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

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

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

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

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


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

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

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

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


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

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

请注意,测试集合中的成员身份比通过string.ascii_字母进行迭代要快得多

请注意,我不会说希伯来语,所以我可能遗漏了字母表中的一两个字母

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

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

请注意,测试集合中的成员身份比通过string.ascii_字母进行迭代要快得多

请注意,我不会说希伯来语,所以我可能遗漏了字母表中的一两个字母

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

也尝试过,但未能找到不完全相同的字符串English@OferSadan是的,我已经更新了答案。这个应该能用。也试过了,找不到不完全正确的字符串English@OferSadan是的,我已经更新了答案。这一个应该可以用。这一点都没有用,有些字符串是多个单词,有些是胡言乱语,但我仍然需要它们,因为它们只包含希伯来语letters@OferSadan那么,是的,最好使用正则表达式。但速度会慢一些。这一点都不有用,有些字符串是多个单词,有些是乱七八糟的,但我仍然需要它们,因为它们只包含希伯来语letters@OferSadan那么,是的,最好使用正则表达式。但速度会慢一些。