【问题标题】:python find-replace non-latin word in string with regexpython用正则表达式查找替换字符串中的非拉丁词
【发布时间】:2012-12-06 20:04:28
【问题描述】:

我正在尝试这样做:

val = re.sub(r'\b' + u_word +'\b', unicode(new_word), u_text)

(所有字符串都是非拉丁的。)

它根本不起作用!

是否可以用正则表达式查找-替换非拉丁文本中的非拉丁词(整个词)? 怎么样?

编辑:

如果你想测试这些字符串:

>>> u_word = u'αβ'
>>> u_text = u'αβγ αβ αβγδ δαβ'
>>> new_word = u'χχ'
>>> val = re.sub(r'\b' + u_word +r'\b', unicode(new_word), u_text)
>>> val
u'\u03b1\u03b2\u03b3 \u03b1\u03b2 \u03b1\u03b2\u03b3\u03b4 \u03b4\u03b1\u03b2'
>>> u_text
u'\u03b1\u03b2\u03b3 \u03b1\u03b2 \u03b1\u03b2\u03b3\u03b4 \u03b4\u03b1\u03b2'
>>> 

【问题讨论】:

  • 你介意添加 u_word 和 new_word 以便能够测试
  • 第二个\b 必须是原始字符串...否则将解释为\x08

标签: python regex


【解决方案1】:

您需要将 re.UNICODE 标志传递给sub,如下所示:

val = re.sub(r'\b' + u_word + r'\b', unicode(new_word), u_text, flags=re.UNICODE)

\b 是一个单词边界。如果没有re.UNICODE 标志,“单词”仅包含来自集合[a-zA-Z0-9_] 的字符,因此αβ 不会被视为“单词”。有关详细信息,请参阅 the re documentation(特别是 \b\wre.UNICODE)。

仅供参考:

  • 如果 new_word 已经是一个 unicode 字符串(如您的示例),unicode(new_word) 是多余的,it returns new_word unmodified
  • 在 Python 3.x 中,unicode 不再是特殊情况。您的代码在 Python 3.x 中可以正常工作(减去 unicode(),因为不再需要它,所以已将其删除)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-05-18
    • 2022-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-04
    • 2015-07-09
    相关资源
    最近更新 更多