regex Python Docx使用literal '?'在正则表达式中的引号内

tquggr8v  于 2023-06-30  发布在  Python
关注(0)|答案(1)|浏览(73)

我正在使用Python docx库编写代码,以查找并突出显示文本中的所有引号。除非引号中有问号(例如:它可以找到“你好吗?但在“Hello?”上返回NoneType对象。你好吗?“并在下面的location.span()上抛出AttributionError)。
我试着摆弄正则表达式,包括“([\w?]*?)”和\?尝试了几次,但似乎都不起作用--下面的正则表达式通过了正则表达式检查器,并显示“Hello?你好吗?“例如,但我的程序不会

document = Document(filepath)

def highlight_quotes(document):
    for paragraph in document.paragraphs:
        if matches := re.findall(r'“(.*?)”', paragraph.text):
            quotes = []
            for i in range(len(matches)):
                location = re.search(matches[i], paragraph.text)
                start_index, end_index = location.span()
                quotes.append((start_index, end_index))
kadbb459

kadbb4591#

问题是,当您执行re.search(matches[i], paragraph.text)时,您试图将文本的一部分用作正则表达式。但它不是正则表达式,如果它包含在正则表达式中有特殊含义的字符(例如?)将无法正确匹配,甚至可能引发异常。
您可以使用re.escape()来转义所有特殊字符,但这仍然是不正确的。如果有任何重复的匹配,它将只返回第一个匹配的位置。
如果您想获得匹配项的位置,请使用re.finditer()--它返回match对象,而不是返回文本,您可以从中获得每个匹配项的跨度。

def highlight_quotes(document):
    for paragraph in document.paragraphs:
        quotes = [match.span() for match in re.finditer(r'“(.*?)”', paragraph.text)]
        # rest of code

相关问题