对于同一输入字符串,正则表达式的行为不同

2024-09-26 22:44:47 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试获取带有特定字符串的pdf页面,字符串为:

“损益表”

我正试图使用以下正则表达式来实现这一点:

re.search('statement of profit or loss', text, re.IGNORECASE)

但即使页面包含这个字符串“损益表”,regex也没有返回任何结果。 在进一步调查该文件时,我发现文件中“利润”中的“fi”字符更加拥挤。当我从文档中复制并粘贴到代码中时,效果很好

所以,如果我从文档中复制“损益表”,并将其粘贴到代码中的re.search()中,它就可以正常工作。但是,如果我在代码中手动编写“损益表”,则re.search()将不返回任何值。 我怎样才能避免这种行为


Tags: or文件of字符串代码文档research
1条回答
网友
1楼 · 发布于 2024-09-26 22:44:47

从PDF复制的“拥挤”字符实际上是一个单个字符:“fi连字”U+FB01: ^{}

要么是在源文档中输入的,要么是用于创建PDF的排版引擎将组合f+i替换为fi

将两个或多个字符组合成一个字形是“良好排版”的一个相当常见的操作,并且不限于fiflfffj,尽管这些是最常用的组合。(这是因为在某些字体中f字形的长悬部分不和谐地接触或重叠下一个字符。)实际上,你可以有任何数量的连字;有些Adobe字体对Th使用单个连字

通常这对于文本提取来说不是问题,因为在PDF中可以指定某些字形必须解码为字符串,即原始字符。因此,可能您的PDF不包含这样的定义,或者排版引擎没有麻烦,因为单个字符本身就是一个有效的Unicode字符(尽管强烈建议不要使用它)

您可以通过在进一步处理以下内容之前显式清理文本字符串来解决此问题:

text = text.replace('fi', 'fi')

–对其他具有Unicode代码点的有问题的连字重复此操作:(我可能错过了更多)

相关问题 更多 >

    热门问题