阿拉伯语正则表达式给出TypeError

时间:2017-09-22 23:25:26

标签: python regex arabic

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

    text = re.sub("[إأٱآا]", "ا", text)

但是,我得到了这个(Python 2.7)错误:

TypeError: expected string or buffer

我是一个正则表达式的新手,我想这是一件很容易解决的问题,但是我是 不知道怎么样?感谢。

4 个答案:

答案 0 :(得分:0)

re.sub期望正则表达式作为第一个参数。你需要逃离模式中的左括号。使用\[代替[

答案 1 :(得分:0)

很抱歉,我不能在评论部分中说明这一点。据我所知,re.sub没有任何错误。因为如果你将字符编码回unicode,你会得到以下的逐字。

text = re.sub("[\u0625\u0623\u0671\u0622\u0627]", "\u0627", text)
  1. 因为它是阿拉伯语,记住它是从右到左,视觉效果有点混乱。
  2. 实际上是尝试用一个字符替换一组字符。
  3. 虽然为什么会用\u0627取代\u0627,但我不知道。
  4. 我认为问题出在text上。如果您可以执行print(text),那么我们可以查看其中是否有任何字符属于"[إأٱآا]" == "[\u0625\u0623\u0671\u0622\u0627]"

    只是一个quip,\u0627是左边最小的垂直线; - )

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

    for x in mystr: print(x + '-' + str(ord(x)))
    

    http://www.fileformat.info/info/unicode/char/0627/index.htm

    <强> EDITED

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

    干杯!

答案 2 :(得分:0)

这就是我最终做到的方式:

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

谢谢大家的帮助。

答案 3 :(得分:0)

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

#coding: utf-8

import re

text = re.sub(u"[إأٱآا]", u"ا", u"الآلهة")

print text

获得:

الالهة