所以我有希伯来语和英语的庞大字符串列表,我想从他们中只提取希伯来语中的字符串,但是找不到与希伯来语一起使用的正则表达式。
我尝试过比较每个角色的愚蠢方法:
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命令也会有帮助
答案 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