使用Python正则表达式模块处理带重音的Unicode字符

3

我有以下两个函数,它们在处理 ASCII 字符串时使用 re 模块能够完美运行:

import re

def findWord(w):
    return re.compile(r'\b{0}.*?\b'.format(w), flags=re.IGNORECASE).findall


def replace_keyword(w, c, x):
    return re.sub(r"\b({0}\S*)".format(w), r'<mark style="background-color:{0}">\1</mark>'.format(c), x, flags=re.I)

然而,他们在使用带重音字符的utf-8编码字符串时失败了。在进一步搜索后,我发现regex模块更适合Unicode字符串,因此我已经尝试将其移植到使用regex,但是过去几个小时似乎没有什么作用。目前我的代码如下:

import regex

def findWord(w):
    return regex.compile(r'\b{0}.*?\b'.format(w), flags=regex.IGNORECASE|regex.UNICODE).findall

def replace_keyword(w, c, x):
    return regex.sub(r"\b({0}\S*)".format(w), r'<mark style="background-color:{0}">\1</mark>'.format(c), x, flags=regex.IGNORECASE|regex.UNICODE)

然而,使用带重音符号的(未规范化的)utf-8编码字符串时,我一直收到ordinal not in range错误。
编辑:建议的可能是重复问题:如何匹配非英语字符的正则表达式?不能解决我的问题。我想使用python re/regex模块。其次,我想通过python使findreplace函数工作。
编辑:我正在使用python 2。
编辑:如果您认为您可以帮助我使用Python 3使这两个函数工作,请告诉我。我希望能够通过我的python 2脚本调用python 3来仅使用这两个函数。

他们在使用UTF-8编码的字符串时失败了。是的,他们确实失败了。这是可以预料的,因为他们处理的是文本,而UTF-8编码的字符串并不是文本。 - Ignacio Vazquez-Abrams
1
可能是重复的问题:正则表达式匹配非英语字符? - Izzy
1
你正在使用Python 2还是3?“UTF-8编码字符串”是什么意思?在Python 2中,字符串仅限于ASCII字符,而在Python 3中,字符串允许任何Unicode代码点。像UTF-8这样的编码在读取或写入文本时很重要,在Python内部,字符串本身并没有编码。 - dimo414
@dimo414:感谢您提供的信息,“在Python中,字符串本身没有编码”。简而言之,我有带重音符号的字符出现在我的字符串中,我想让这两个函数(查找和替换)在Python 2中为它们工作。 - The Wanderer
@nhahtdh:我不确定我是否理解正确。我能保留重音吗? - The Wanderer
显示剩余3条评论
1个回答

0

我觉得我正在朝着某个方向前进。我正在尝试在不使用模块reregex,而是使用纯Python来使其工作:

found_keywords = []
for word in keyword_list:
    if word.lower() in article_text.lower():
         found_keywords.append(word)

for word in found_keywords:  # highlight the found keyword in the text
    article_text = article_text.lower().replace(word.lower(), '<mark style="background-color:%s">%s</mark>' % (yellow_color, word))

现在,我只需要以不区分大小写的方式替换找到的关键字,就可以继续了。
请帮我完成这最后一步,以不使用 re 或 regex 的方式以不区分大小写的方式替换关键字,以使其适用于带有重音的字符串。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接