正则表达式:re.sub()、\b 和西里尔字符

0 投票
1 回答
1900 浏览
提问于 2025-04-17 20:53

我正在尝试替换文本中整个西里尔字母单词的外观:

# -*- coding: utf-8 -*-
import re
S = u"раз Два трИ".lower()
print re.sub(ur"\bдва\b", u"четыре", S, re.U)

结果打印出“раз два три”,而我其实希望得到“раз четыре три”。

同时,search()和findall()的功能都很好:

print re.search(ur"\bдва\b", S, re.U).group(0)
print re.findall(ur"\bдва\b", S, re.U)

所以问题只出在re.sub()上。

拉丁字母的替换效果很好:

S = u"one Two threE".lower()
print re.sub(ur"\btwo\b", u"four", S, re.U)

如果我尝试以下方法,它会吞掉空格(看起来很难看):

print re.sub(u"[^а-яё\d]два[^а-яё\d]", u"четыре", S)

我尝试保持空格,但没有成功:

print re.sub(u"(?:[^а-яё\d])(два)(?:[^а-яё\d])", u"четыре", S)

替换也没有帮助:

S = u"раз Два трИ".lower()
print S
S.replace(u"два", u"четыре")
print S

结果打印出“раз два три”两次。

1 个回答

1

你应该使用关键字参数 flags 来传递标志:

In [3]: S = u"раз Два трИ".lower()
In [5]: print re.sub(ur"\bдва\b", u"четыре", S, flags=re.U)
раз четыре три

撰写回答