【问题标题】:Syntax for Conditional Statement With Regex Function带有正则表达式函数的条件语句的语法
【发布时间】:2021-04-22 06:17:07
【问题描述】:

我创建了一个代码来解析多个 pdf 文件并从每个页面返回一行数据。我遇到了一个问题,即我的 pdf 文件中的某些页面没有这一行。发生这种情况时,我的代码会完全忽略该页面;但是我希望它为找不到指定行的页面打印一个“无”。我认为这是一个简单的修复,但事实证明它比我想象的要复杂一些。这是我正在拉的线以及我尝试过的示例:

#pattern I told my code to look for within each page of pdf

sqft_re = re.compile('(\d+(sqft)\s+[$]\d+[.]\d+\s+\d{2}/\d{2})') 

#this is an example of what the line I want in each page looks like: 

'1600sqft $154.98 10/14' 

基本上,我希望代码能够解析每个 pdf 并在可以找到的情况下返回该行。如果不能,我希望它在没有该行的情况下为所述页面返回一个“无”。我已将这些行称为这样的列表:

lines = []

这是我如何设置我的 for 循环来浏览我的 pdf 文件的每一页:

for files in os.listdir(directory):
  if files.endwith(".pdf"): 
       with pdfplumber.open(files) as pdf:
         pages = pdf.pages
         for page in pdf.pages:
           text = page.extract_text()
           for line in text.split('\n'):
             
             line = sqft_re.search(line)
             if line:
                 line.group(1)
                 lines.append(line)

输出示例:

lines

'1600sqft $154.98 10/14' 
'1450qft $113.02 07/05' 
'90sqft $60.17 05/12' 
'3000sqft $500.98 09/20' 

此代码成功返回带有该行的页面的数据列表。但是,没有该行的页面将被省略。以下是我认为可以解决问题的方法,只需为没有该行的页面打印 none:

for files in os.listdir(directory):
  if files.endwith(".pdf"): 
       with pdfplumber.open(files) as pdf:
         pages = pdf.pages
         for page in pdf.pages:
           text = page.extract_text()
           for line in text.split('\n'):
             
             line = sqft_re.search(line)
             if line:
                 line.group(1)
             else:
                 line = 'None'
             lines.append(line)

但是这不起作用,现在不是只用“无”代替没有值的页面,pdf 页面中的每一行都打印为“无”,除了它与该行匹配的位置。所以基本上我现在有一个看起来像这样的列表:

lines

'None'
'None'
'None'
'1600sqft $154.98 10/14' 
'None'
'None'
'None'
'1450qft $113.02 07/05' #etc.....

我尝试了一些其他的事情,比如当它与我正在寻找的不匹配时调用一个不同的函数,用我自己的字符串来替换这个值等等。我仍然遇到同样的问题。在我的示例 pdf 中,只有一页没有此行,因此我的列表应如下所示:

'1600sqft $154.98 10/14' 
'1450qft $113.02 07/05' 
'90sqft $60.17 05/12' 
'3000sqft $500.98 09/20' 
'None'

我对 python 也很陌生(R 是我主要使用的),所以我确信我在这里忽略了一些东西,但是对于我所缺少的东西的任何指导将不胜感激!

【问题讨论】:

  • 您的if line: line.group(1) else: line = 'None' 不正确:line.group(1) 没有做任何事情。通常,您应该为每个页面设置一个标志,并且仅在没有匹配行的情况下将None 添加到lines。缩进要非常小心:lines.append('None') 应该只在页面处理后出现。
  • @WiktorStribiżew 不想占用您的时间,但作为 python 的新手,我想进一步了解您的第一条评论为什么 line.group(1) 不做任何事情,您基本上是在说我应该只创建一个标志变量而不是使用 else 语句?
  • @WiktorStribiżew 对,所以它是一个标志变量。谢谢你。老实说,我什至没有想到这一点。非常感谢!

标签: python regex if-statement pdf conditional-statements


【解决方案1】:

您应该将匹配项附加到 lines 变量,而不是行本身,除非这是您的意图。

此外,您需要在检查每个page 之前将标志设置为False,一旦匹配,将其设置为True。如果页尾是False,在lines后面加上None

查看带有循环的示例 Python 代码:

for page in pdf.pages:
  text = page.extract_text()
  found = False
  for line in text.split('\n'):
    line = sqft_re.search(line)
    found = not found
    lines.append(line.group(1))
  if not found:
    lines.append('None')

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-13
    • 1970-01-01
    • 1970-01-01
    • 2021-07-11
    • 1970-01-01
    相关资源
    最近更新 更多