正则表达式与unicode和str

时间:2013-11-26 21:56:25

标签: python regex unicode

我有一个正则表达式和替换函数列表。

regex function

replacement_patterns = [(ur'\\u20ac', ur'  euros'),(ur'\xe2\x82\xac', r'  euros'),(ur'\b[eE]?[uU]?[rR]\b', r'  euros'), (ur'\b([0-9]+)[eE][uU]?[rR]?[oO]?[sS]?\b',ur' \1 euros')]

class RegexpReplacer(object):
def __init__(self, patterns=replacement_patterns):
    self.patterns = [(re.compile(regex, re.UNICODE | re.IGNORECASE), repl) for (regex, repl) in patterns]

def replace(self, text):
    s = text
    for (pattern, repl) in self.patterns:
        (s, count) = re.subn(pattern, repl, s)
    return s

如果我将字符串写成下面的字符:

string='730\u20ac.\r\n\n ropa surf  ... 5,10 muy buen estado..... 170 \u20ac\r\n\nPack 850\u20ac, reparaci\u00f3n. \r\n\n'

replacer = RegexpReplacer()

texto= replacer.replace(string)

我得到了完美的结果。

但是如果我在迭代我刚加载的JSON文件时调用该函数,它就不起作用(没有错误但没有替换)

当我通过类型变量调用函数时,函数会收到一个STR,当我从JSON迭代调用它时,它会收到一个unicode。

我的问题是为什么我的正则表达式不能用于unicode,不应该这样做吗?

2 个答案:

答案 0 :(得分:0)

也许你需要这样的东西

import re
regex = re.compile("^http://.+", re.UNICODE)

如果你需要不止一个,你可以这样做

regex = re.compile("^http://.+", re.UNICODE | re.IGNORECASE)

获取示例

>>> r = re.compile("^http://.+", re.UNICODE | re.IGNORECASE)
>>> r.match('HTTP://ыыы')
<_sre.SRE_Match object at 0x7f572455d648>

结果是否正确?

>>> class RegexpReplacer(object):
...     def __init__(self, patterns=replacement_patterns):
...         self.patterns = [(re.compile(regex, re.UNICODE | re.IGNORECASE), repl) for   (regex, repl) in patterns]
...     def replace(self, text):
...         s = text
...         for (pattern, repl) in self.patterns:
...             (s, count) = re.subn(pattern, repl, s)
...         return s
... 
>>> string='730\u20ac.\r\n\n ropa surf  ... 5,10 muy buen estado..... 170 \u20ac\r\n\nPack 850\u20ac, reparaci\u00f3n. \r\n\n'
>>> replacer = RegexpReplacer()
>>> texto= replacer.replace(string)
>>> texto
u'730  euros.\r\n\n ropa surf  ... 5,10 muy buen estado..... 170   euros\r\n\nPack 850  euros, reparaci\\u00f3n. \r\n\n'

答案 1 :(得分:0)

如果需要Unicode替换模式,还需要对Unicode字符串进行操作。 JSON也应该返回Unicode。

删除\\并删除UTF-8(在Unicode字符串中看不到),以更改以下内容。您也可以使用IGNORE_CASE进行编译,因此不需要[eE]等等:

replacement_patterns = [(ur'\u20ac', ur'  euros'),(ur'\be?u?r\b', r'  euros'), (ur'\b([0-9]+)eu?r?o?s?\b',ur' \1 euros')]

将以下内容设为Unicode字符串(添加u):

string = u'730\u20ac.\r\n\n ropa surf  ... 5,10 muy buen estado..... 170 \u20ac\r\n\nPack 850\u20ac, reparaci\u00f3n. \r\n\n'

然后它也应该在Unicode JSON上运行。