正则表达式匹配阿拉伯语关键字
Regex match Arabic keyword
我有一个简单的正则表达式,可以在文本中找到一些词:
var patern = new RegExp("\bsomething\b", "gi");
此匹配文本中带有空格或标点符号的单词。
因此匹配:
I have something.
但不匹配:
I havesomething.
什么是好的,正是我需要的。
但我对阿拉伯语等语言有疑问。如果我有正则表达式:
var patern = new RegExp("\bرياضة\b", "gi");
和文字:
رياضة أنا أحب رياضتي وأنا سعيد حقا هنا لها حبي
我要找的关键词在文末
但这不管用,就是找不到。
如果我从正则表达式中删除 \b
,它会起作用:
var patern = new RegExp("رياضة", "gi");
但这就是我现在想要的,因为如果它是另一个词的一部分,我不想找到它,就像上面的英语示例:
I havesomething.
所以我对正则表达式的了解真的很少,如果有人可以帮助我用英语和阿拉伯语等语言来解决这个问题。
这不起作用,因为正则表达式引擎不支持阿拉伯语。
您可以在文本中搜索 unicode 字符 (Unicode ranges).
或者您可以使用 encoding 将文本转换为 unicode,然后以某种方式制作正则表达式(我从未尝试过,但它应该可以工作)。
我们首先要明白\b
是什么意思:
\b is an anchor that matches at a position that is called a "word boundary".
在您的情况下,您要查找的单词边界没有其他阿拉伯字母。
为了仅匹配正则表达式中的阿拉伯字母,我们使用 unicode:
[\u0621-\u064A]+
或者我们可以直接使用阿拉伯字母
[ء-ي]+
上面的代码将匹配任何阿拉伯字母。要从中创建单词边界,我们可以简单地在两侧反转它:
[^ء-ي]ARABIC TEXT[^ء-ي]
上面的代码意味着:不要匹配适合您的情况的阿拉伯语单词两侧的任何阿拉伯语字符。
考虑一下你给我们的这个例子,我稍微修改了一下:
أنا أحب رياضتي رياض رياضة رياضيات وأنا سعيد حقا هنا
如果我们只想匹配 رياض
,这个词将使我们的搜索也匹配 رياضة
、رياضيات
和 رياضتي
。但是,如果我们添加上面的代码,匹配将仅在 رياض
上成功。
var x = " أنا أحب رياضتي رياض رياضة رياضيات وأنا سعيد حقا هنا ";
x = x.replace(/([^ء-ي]رياض[^ء-ي])/g, '<span style="color:red"></span>');
document.write (x);
如果您想用一个代码来解释 أآإا
,您可以使用类似这样的代码 [\u0622\u0623\u0625\u0627]
或简单地将它们全部列在方括号 [أآإا]
中。这是完整的代码
var x = "أنا هنا وانا هناك .. آنا هنا وإنا هناك";
x = x.replace(/([أآإا]نا)/g, '<span style="color:red"></span>');
document.write (x);
注意:如果要匹配正则表达式中所有可能的阿拉伯字符,包括所有阿拉伯字母أ ب ت ث ج
、所有变音符号َ ً ُ ٌ ِ ٍ ّ
和所有阿拉伯数字١٢٣٤٥٦٧٨٩٠
,使用这个正则表达式:[،-٩]+
有用link关于阿拉伯字符在Unicode中的排名:https://en.wikipedia.org/wiki/Arabic_script_in_Unicode
如果您不需要复杂的正则表达式(例如,因为您正在寻找一个特定的单词或一个简短的单词列表),那么我发现将搜索文本标记化实际上更容易,并且那样找到它:
>>> text = 'رياضة أنا أحب رياضتي وأنا سعيد حقا هنا لها حبي '
>>> tokens = text.split()
>>> print(tokens)
['رياضة', 'أنا', 'أحب', 'رياضتي', 'وأنا', 'سعيد', 'حقا', 'هنا', 'لها', 'حبي']
>>> search_words = ['رياضة', 'رياضت']
>>> found = [w for w in tokens if w in search_words]
>>> print(found)
['رياضة'] # returns only full-word match
我确定这比 RegEx 慢,但还不够我注意到。
如果您的文本有标点符号,您可以使用 NLTK 进行更复杂的标记化(因此它会找到像“бياض₩؟”这样的东西)。
我用过这个ء-ي٠-٩
,它对我有用
我有一个简单的正则表达式,可以在文本中找到一些词:
var patern = new RegExp("\bsomething\b", "gi");
此匹配文本中带有空格或标点符号的单词。
因此匹配:
I have something.
但不匹配:
I havesomething.
什么是好的,正是我需要的。
但我对阿拉伯语等语言有疑问。如果我有正则表达式:
var patern = new RegExp("\bرياضة\b", "gi");
和文字:
رياضة أنا أحب رياضتي وأنا سعيد حقا هنا لها حبي
我要找的关键词在文末
但这不管用,就是找不到。
如果我从正则表达式中删除 \b
,它会起作用:
var patern = new RegExp("رياضة", "gi");
但这就是我现在想要的,因为如果它是另一个词的一部分,我不想找到它,就像上面的英语示例:
I havesomething.
所以我对正则表达式的了解真的很少,如果有人可以帮助我用英语和阿拉伯语等语言来解决这个问题。
这不起作用,因为正则表达式引擎不支持阿拉伯语。 您可以在文本中搜索 unicode 字符 (Unicode ranges).
或者您可以使用 encoding 将文本转换为 unicode,然后以某种方式制作正则表达式(我从未尝试过,但它应该可以工作)。
我们首先要明白\b
是什么意思:
\b is an anchor that matches at a position that is called a "word boundary".
在您的情况下,您要查找的单词边界没有其他阿拉伯字母。
为了仅匹配正则表达式中的阿拉伯字母,我们使用 unicode:
[\u0621-\u064A]+
或者我们可以直接使用阿拉伯字母
[ء-ي]+
上面的代码将匹配任何阿拉伯字母。要从中创建单词边界,我们可以简单地在两侧反转它:
[^ء-ي]ARABIC TEXT[^ء-ي]
上面的代码意味着:不要匹配适合您的情况的阿拉伯语单词两侧的任何阿拉伯语字符。
考虑一下你给我们的这个例子,我稍微修改了一下:
أنا أحب رياضتي رياض رياضة رياضيات وأنا سعيد حقا هنا
如果我们只想匹配 رياض
,这个词将使我们的搜索也匹配 رياضة
、رياضيات
和 رياضتي
。但是,如果我们添加上面的代码,匹配将仅在 رياض
上成功。
var x = " أنا أحب رياضتي رياض رياضة رياضيات وأنا سعيد حقا هنا ";
x = x.replace(/([^ء-ي]رياض[^ء-ي])/g, '<span style="color:red"></span>');
document.write (x);
如果您想用一个代码来解释 أآإا
,您可以使用类似这样的代码 [\u0622\u0623\u0625\u0627]
或简单地将它们全部列在方括号 [أآإا]
中。这是完整的代码
var x = "أنا هنا وانا هناك .. آنا هنا وإنا هناك";
x = x.replace(/([أآإا]نا)/g, '<span style="color:red"></span>');
document.write (x);
注意:如果要匹配正则表达式中所有可能的阿拉伯字符,包括所有阿拉伯字母أ ب ت ث ج
、所有变音符号َ ً ُ ٌ ِ ٍ ّ
和所有阿拉伯数字١٢٣٤٥٦٧٨٩٠
,使用这个正则表达式:[،-٩]+
有用link关于阿拉伯字符在Unicode中的排名:https://en.wikipedia.org/wiki/Arabic_script_in_Unicode
如果您不需要复杂的正则表达式(例如,因为您正在寻找一个特定的单词或一个简短的单词列表),那么我发现将搜索文本标记化实际上更容易,并且那样找到它:
>>> text = 'رياضة أنا أحب رياضتي وأنا سعيد حقا هنا لها حبي '
>>> tokens = text.split()
>>> print(tokens)
['رياضة', 'أنا', 'أحب', 'رياضتي', 'وأنا', 'سعيد', 'حقا', 'هنا', 'لها', 'حبي']
>>> search_words = ['رياضة', 'رياضت']
>>> found = [w for w in tokens if w in search_words]
>>> print(found)
['رياضة'] # returns only full-word match
我确定这比 RegEx 慢,但还不够我注意到。
如果您的文本有标点符号,您可以使用 NLTK 进行更复杂的标记化(因此它会找到像“бياض₩؟”这样的东西)。
我用过这个ء-ي٠-٩
,它对我有用