Python 阿拉伯文正则表达式给出TypeError

Python 阿拉伯文正则表达式给出TypeError,python,regex,arabic,Python,Regex,Arabic,我有一个简单的正则表达式: text = re.sub("[إأٱآا]", "ا", text) 但是,我得到了以下(Python 2.7)错误: 我是一个regex新手,我想这是一个简单的事情来修复,但我 不知道怎么做?谢谢。re.sub希望正则表达式作为第一个参数。您需要在模式中转义左括号。使用\[而不是[re.sub需要正则表达式作为第一个参数。您需要在模式中转义左括号。使用\[而不是[很抱歉,我无法将其放在评论部分。据我所知,re.sub中没有任何错误。因为如果您将字符编码回

我有一个简单的正则表达式:

    text = re.sub("[إأٱآا]", "ا", text)
但是,我得到了以下(Python 2.7)错误:

我是一个regex新手,我想这是一个简单的事情来修复,但我
不知道怎么做?谢谢。

re.sub
希望正则表达式作为第一个参数。您需要在模式中转义左括号。使用
\[
而不是
[

re.sub
需要正则表达式作为第一个参数。您需要在模式中转义左括号。使用
\[
而不是
[

很抱歉,我无法将其放在评论部分。据我所知,re.sub中没有任何错误。因为如果您将字符编码回unicode,则会得到下面的逐字记录

text = re.sub("[\u0625\u0623\u0671\u0622\u0627]", "\u0627", text)
  • 因为它是阿拉伯语,请记住它是从右到左的,视觉效果有点混乱,仅此而已。
  • 它实际上是试图用一个字符替换一组字符
  • 虽然人们为什么要用
    \u0627
    取代
    \u0627
    ,但我不知道
  • 我认为问题在于
    text
    。如果你能做
    print(text)
    ,那么我们可以看到其中是否有属于
    “[code>”
    =
    ”[\u0625\u0623\u0671\u0622\u0627]”

    简单地说,
    \u0627
    是左边最小的垂直线;-)

    在理解它的实际用途方面没有什么帮助(只需复制问题中的整个语句并执行以下操作)


    已编辑

    >>> re.sub(myset,myrep,text)
    u'\u0627\u0627\u0627abc'
    >>> res=re.sub(myset,myrep,text)
    >>> res
    u'\u0627\u0627\u0627abc'
    >>> myrep
    u'\u0627'
    >>> myset
    u'[\u0625\u0623\u0671\u0622\u0627]'
    >>> text
    u'\u0625\u0623\u0623abc'
    >>> print(res)
    اااabc
    >>> print(myrep)
    ا
    >>> print(myset)
    [إأٱآا]
    >>> print(text)
    إأأabc
    >>>
    
    因此,从本质上讲,一切都很好,错误在其他地方。

    我认为这再现了在其他地方发生的错误,而这就是

    >>> print(u'\u0625'+ord(u'\u0625'))
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    TypeError: coercing to Unicode: need string or buffer, int found
    
    打印(u'\u0625'+ord(u'\u0625')) 回溯(最近一次呼叫最后一次): 文件“”,第1行,在 TypeError:强制使用Unicode:需要字符串或缓冲区,找到int

    干杯!

    很抱歉,我无法将此内容放在评论部分。据我所知,re.sub中没有任何错误。因为如果您将字符编码回unicode,您将获得以下逐字记录

    text = re.sub("[\u0625\u0623\u0671\u0622\u0627]", "\u0627", text)
    
  • 因为它是阿拉伯语,请记住它是从右到左的,视觉效果有点混乱,仅此而已。
  • 它实际上是试图用一个字符替换一组字符
  • 虽然人们为什么要用
    \u0627
    取代
    \u0627
    ,但我不知道
  • 我认为问题在于
    text
    。如果你能做
    print(text)
    ,那么我们可以看到其中是否有属于
    “[code>”
    =
    ”[\u0625\u0623\u0671\u0622\u0627]”

    简单地说,
    \u0627
    是左边最小的垂直线;-)

    在理解它的实际用途方面没有什么帮助(只需复制问题中的整个语句并执行以下操作)


    已编辑

    >>> re.sub(myset,myrep,text)
    u'\u0627\u0627\u0627abc'
    >>> res=re.sub(myset,myrep,text)
    >>> res
    u'\u0627\u0627\u0627abc'
    >>> myrep
    u'\u0627'
    >>> myset
    u'[\u0625\u0623\u0671\u0622\u0627]'
    >>> text
    u'\u0625\u0623\u0623abc'
    >>> print(res)
    اااabc
    >>> print(myrep)
    ا
    >>> print(myset)
    [إأٱآا]
    >>> print(text)
    إأأabc
    >>>
    
    因此,从本质上讲,一切都很好,错误在其他地方。

    我认为这再现了在其他地方发生的错误,而这就是

    >>> print(u'\u0625'+ord(u'\u0625'))
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    TypeError: coercing to Unicode: need string or buffer, int found
    
    打印(u'\u0625'+ord(u'\u0625')) 回溯(最近一次呼叫最后一次): 文件“”,第1行,在 TypeError:强制使用Unicode:需要字符串或缓冲区,找到int
    干杯!

    我终于做到了:

    sText = re.sub(ur"[\u0625|\u0623|\u0671|\u0622|\u0627]", ur"\u0627", sText)
    

    谢谢大家的帮助。

    我最终就是这样做的:

    sText = re.sub(ur"[\u0625|\u0623|\u0671|\u0622|\u0627]", ur"\u0627", sText)
    

    谢谢大家的帮助。

    将所有字符串定义为
    unicode
    ,不要忘记在文件头中添加编码行:

    #coding: utf-8
    
    import re
    
    text = re.sub(u"[إأٱآا]", u"ا", u"الآلهة")
    
    print text
    
    要获得:

    الالهة
    

    将所有字符串定义为
    unicode
    ,不要忘记在文件头中添加编码行:

    #coding: utf-8
    
    import re
    
    text = re.sub(u"[إأٱآا]", u"ا", u"الآلهة")
    
    print text
    
    要获得:

    الالهة
    

    它一定与编码有关,你确定它是UTF8吗?阿拉伯语是RTL,这让你很反感;Python看不到你的代码,就像它在这里的显示方式一样。例如,第二个
    [
    实际上是一个
    ]
    这是镜像显示的,看起来像第二个字符串的大部分内容实际上都在第一个字符串中,反之亦然。这一定与编码有关,你确定它是UTF8吗?阿拉伯语是RTL,这让你很反感;Python看不到你的代码,就像这里显示的那样。例如,第二个
    [
    实际上是一个
    ]
    显示的是镜像的,看起来像第二个字符串的大部分内容实际上在第一个字符串中,反之亦然。本质上,错误在于您试图将
    int
    添加到
    str
    中。int>128,因此它抱怨缓冲区。@BenderRodriguez您能找到添加的位置吗
    str
    int
    ?如果我写的东西不清楚,请告诉我,我可以提高我的写作水平。本质上,错误在于您试图在
    str
    中添加
    int
    。int>128,因此它会抱怨缓冲区。@BenderRodriguez您是否能够找到添加
    str
    的位置de>int?如果我写的东西不清楚,请告诉我,我可以提高我的写作水平。