regex Python正则表达式匹配无法匹配孟加拉语句子中的特定单词

3wabscal  于 2023-05-01  发布在  Python
关注(0)|答案(2)|浏览(158)

这里有一个奇怪的小问题,我用孟加拉语写了这个(随机的)句子:"তিনি কবিতা প্রিয়, সুগঠিত স্বাস্থ্যের অধিকারী।"我试着在它上运行一个正则表达式(使用Python re library),如下所示:

  • সুগঠিত ("token #4") :
re.search(r"\bসুগঠিত\b", "তিনি কবিতা প্রিয়, সুগঠিত স্বাস্থ্যের অধিকারী।") : <re.Match object; span=(19, 25), match='সুগঠিত'>
  • কবিতা ("token #2"):
re.search(r"\bকবিতা\b", "তিনি কবিতা প্রিয়, সুগঠিত স্বাস্থ্যের অধিকারী।"): None

你知道为什么会这样吗
更新(来自下面的答案建议):

  • 查看孟加拉语(和其他印度语)中使用的变音符号
dbf7pr2w

dbf7pr2w1#

如果你检查一下你的কবিতা是由什么字符组成的(我喜欢使用这个服务),你会知道最后一个字母是U+09BE,也就是 BENGALI VOWEL SIGN AA 属于Mc (Mark, spacing combining) Unicode category

注意**Mc Unicode category chars不属于re regex中的单词chars。Python re\w匹配"Unicode letter, ideogram, digit, or underscore",其中“表意文字”仅指Mn (Mark, Nonspacing) Unicode category

regex * 中的最后一个\b单词边界要求 * 要么是字符串的结尾,要么是紧接在AA元音之后的非单词字符,因为单词边界正好出现在非单词AA字符之后。
因此,如果您需要将所有组合标记添加到单词边界中,则需要使用PyPi regex library,其中问题已得到解决:

word字符的定义issue #1693050

“word”字符的定义已扩展为Unicode。它符合http://www.unicode.org/reports/tr29/的Unicode规范。
在线查看Python演示:

import regex
print( regex.search(r"\bকবিতা\b", "তিনি কবিতা প্রিয়, সুগঠিত স্বাস্থ্যের অধিকারী।") )
# => <regex.Match object; span=(5, 10), match='কবিতা'>
qnyhuwrf

qnyhuwrf2#

它对我有效:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import regex

print(regex.search(r"\bসুগঠিত\b", "তিনি কবিতা প্রিয়, সুগঠিত স্বাস্থ্যের অধিকারী।"))
print(regex.search(r"\bকবিতা\b", "তিনি কবিতা প্রিয়, সুগঠিত স্বাস্থ্যের অধিকারী।"))

相关问题