社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

如何使用正则表达式从Python文本中提取段落

Al Ash • 4 年前 • 2145 次点击  

我对regex不熟悉,正在尝试从PDF提取的文本中提取段落。我想设定的标准是:任何以大写字母开头,以句号/问号/感叹号后跟换行符结尾的段。例如,如果我有字符串

"but Okay. So.\n What do we\n do now?\n I have no clue.\n"

我想把[“好的,那么.\n”,“我们现在要做什么?\n”,“我不知道.\n”]作为三个独立的块返回。

到目前为止,我一直在尝试:

re.findall("[A-Z].*[\.\?\!]\n",text,re.DOTALL)

但它不起作用,也就是说,它没有返回文本中的单独块。对于提供的示例,我只是一次性返回整个字符串。任何帮助都将不胜感激!

编辑:我应该澄清一下,我意识到我提供的示例并没有涵盖我试图避免的所有内容——我提取的文本中有一堆换行符,前面没有句号,我希望保持这些完整。还有一些以小写字母开头的零散位,它们不是实际段落的开头,所以我想也排除它们,并从大写字母开始匹配。

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/131734
文章 [ 1 ]  |  最新文章 4 年前
constantstranger
Reply   •   1 楼
constantstranger    4 年前

干得好:

import re
text = "Okay. So.\n What do we do now?\n I have no clue.\n"
print(re.findall(".*\n",text))

... 给予:

['Okay. So.\n', ' What do we do now?\n', ' I have no clue.\n']

更新:问题中描述的行为可以实现如下:

import re
text = "but Okay. So.\n What do we\n do now?\n I have no clue.\n"
print(re.findall('[A-Z].*?[?!.]\n', text, re.S))

输出:

['Okay. So.\n', 'What do we\n do now?\n', 'I have no clue.\n']

说明:

  • [A-Z]匹配前导大写字母
  • .*? 由于 ? 详情见 docs 详情如下:

?, +?, ?? 那是 “,“+”和“?”限定词都是贪婪的;它们尽可能多地匹配文本。有时这种行为并不可取;如果重新<。 >与“b”匹配,它将匹配整个字符串,而不仅仅是“”。添加?在限定符使其以非贪婪或最小的方式执行匹配之后;尽可能少的字符将被匹配。使用RE<。 ?>将只匹配“”。

  • [?!.]\出现“?”,“!”时匹配n次或“.”后跟“\n”,这要感谢非贪婪限定符 ? 在前面的项目符号中,它不会跳过任何与此匹配的内容,而是将字符串划分为问题中描述的“段落”。