我有一个正则表达式和替换函数列表。
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,不应该这样做吗?
答案 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上运行。