regex 正则表达式使用Python从PDF文件中提取标题和子标题

tkqqtvp1  于 2023-05-19  发布在  Python
关注(0)|答案(2)|浏览(213)

我有一个pdffile,使用pdfplumber,我已经从它提取了所有的文本。然后,我需要找到所有的标题和副标题从这篇文章。我想使用标题和副标题来提取标题和副标题中的文本。
我的标题看起来像1。航向一2.航向二3.航向三4.标题、标题四是等等-它们最多可以有5个单词
我的副标题看起来和标题一样,比如1.1标题中的一个1.2标题中的两个2.1标题中的一个3.2标题中的两个三个等等。我做不到。我试着跟随,但没有工作,它只工作了部分,它可以找到一些标题,但没有副标题

import re
# Define the pattern
pattern = r'^\s*\d+(\.\d+)?\. ((?:\b\w+\b\s*){1,5})'
# Find all matches in the text
matches = re.findall(pattern, text, re.MULTILINE)
print(matches)

我希望所有的标题和副标题将在一个列表返回如上所述
以下是示例输入数据:

text= """
lotsf text text text 

1. Heading one
lots of text lots of text lots of text lot of text
123 456 text text2
0 10 text

1.1 subheading one of one

lot of text lots of text text is all
lot of text.
text and text.

1.2 subheading two of one

i m a ML enginner
i work in M
i do work in oracle also

2. Heading two

text again again text more text
holding on
backup and recovery

2.1 subheading one of two please

text text text text text

2.2 subheading two of two is

text or numbers
10  text 6345

2.3 subheading there of two

000 text 34
0 devices 
so many phone devices
""""

期望输出为:

[ 1. Heading one , 1.1 subheading one of one , 1.2 subheading two of one,2. Heading two,2.1 subheading one of two please,2.2 subheading two of two is,2.3 subheading there of two]
6ojccjat

6ojccjat1#

它找不到子标题的原因是(\.\d+)?\.正则表达式要求在标题数字之后总是有一个点,而你的例子子标题在第二个数字之后没有一个点(它不是1.1.,它只是1.1)。要修复此问题,请编辑regex为^(\d+\.\d* (?:\w+ *){1,5})

  • 首先展开()以包围所需的所有内容
  • 删除regex中不必要的部分:\s*\b
  • 将数字部分更改为\d+\.\d*以接受主/次标题
rdrgkggo

rdrgkggo2#

它应该是posible在shell没有任何超过pdftotext做大部分的文本任务。
pdftotext input.pdf output.txt
你说举个例子

lotsf text text text

etc...

因此,如果第二个命令是在windows中(或类似的nix sed)
type output.txt |findstr /R "^[0-9]\." >headings.txt
我们会得到一个文件

1. Heading one
1.1 subheading one of one
1.2 subheading two of one
2. Heading two
2.1 subheading one of two please
2.2 subheading two of two is
2.3 subheading there of two

现在它变得稍微困难,因为你想要[项目1.,项目2,项目3]
所以最接近的就是
@echo [>list.txt&&@for /f "tokens=*" %f in (headings.txt) do @echo/|@set /p=%f, >>list.txt
echo ]>>list.txt
结果

[
1. Heading one,  1.1 subheading one of one,  1.2 subheading two of one,  2. Heading two,  2.1 subheading one of two please,  2.2 subheading two of two is,  2.3 subheading there of two, ]

所以Windows控制台命令经常会引起两个非常小的问题
1.我应该试着删除初始换行和
1.有一个循环final ,,通常不会添加一个,但对于CSV,这通常不是问题。
因此,所有这些都可以是一个4行.cmd文件,用于“拖放”任何PDF,并立即输出一个结构化列表,以便在python或记事本中进行下游编辑,或用作源PDF中的书签。
潜在的批处理文件(需要针对用户位置集进行调整)
dropMeApdf2LIST.cmd(需要与命令行略有不同的结构)

@echo off
"path to poppler\bin\pdftotext.exe" -enc UTF-8 -nopgbrk "%~1" "%~dpn1.txt"
type "%~dpn1.txt" |findstr /R "^[0-9]\." >"%~dpn1-headings.txt"`
echo [>"%~dpn1-list.txt"
for /f "usebackq tokens=*" %%f in ("%~dpn1-headings.txt") do @echo/|@set /p=%%f, >>"%~dpn1-list.txt"  
echo ]>>"%~dpn1-list.txt"
notepad "%~dpn1-list.txt"

因此,将此页面作为PDF文件放到该文件中,我就得到了这个,并幽默地包括了我的列表1。2、楼上。

相关问题