首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >匹配以句点结尾的段落的正则表达式

匹配以句点结尾的段落的正则表达式
EN

Stack Overflow用户
提问于 2020-06-27 02:22:50
回答 3查看 138关注 0票数 3

我有一系列可以采用这种格式的文档:

代码语言:javascript
复制
Diagnosis of one of the following: A) Neovascular (wet) age-related
macular degeneration OR B) Macular edema following retinal vein
occlusion, OR C) Diabetic macular edema OR D) Diabetic retinopathy in
patients with diabetic macular edema. More text here.

PA Criteria

Criteria Details


Eylea (s)

Products Affected
 EYLEA

Exclusion
Criteria

Required
Medical
Information

Age Restrictions

Prescriber
Restrictions

Coverage
Duration

Other Criteria

Off Label Uses











12 months

Indications

All Medically-accepted Indications.

Formulary ID 20276, Version 12

101

我想匹配(然后删除)段落中以句点结尾的所有文本。所以,我想删除

代码语言:javascript
复制
Diagnosis of one of the following: A) Neovascular (wet) age-related
macular degeneration OR B) Macular edema following retinal vein
occlusion, OR C) Diabetic macular edema OR D) Diabetic retinopathy in
patients with diabetic macular edema.

代码语言:javascript
复制
All Medically-accepted Indications.

我尝试过这样的东西:

代码语言:javascript
复制
\n\n[\s\S]*?[.][\n\n]

但我需要说的是,\n\n不能存在于

代码语言:javascript
复制
[\s\S]*?

我该怎么做呢?

谢谢!

EN

回答 3

Stack Overflow用户

发布于 2020-06-27 02:37:58

您可以使用以下任一正则表达式来完成此操作。

选项1

此选项使用re.DOTALL

See regex in use here

代码语言:javascript
复制
(?:\A|\n{2})(?:(?!\n{2}).)+\.(?=\n{2}|\Z)

它的工作原理:

  • (?:\A|\n{2})匹配以下任一项:
    • \A断言字符串开头的位置(不同于断言line)
    • \n{2}开头位置的characters

匹配两个连续的换行符^

  • (?:(?!\n{2}).)+匹配任何字符,但无法匹配两个连续的换行符匹配literally
  • (?=\n{2}|\Z)先行匹配以下任一项(断言后面的匹配,但不将匹配包括在结果中):
    • \n{2}匹配两个连续的换行符位置与characters
    • \Z相反-断言字符串末尾的位置(不同于$ -断言line)

结尾的tempered greedy token .

选项2

此选项比选项1效率更高-步骤减少约22%。

See regex in use here

代码语言:javascript
复制
(?:\A|\n{2})(?:.|\n(?!\n))+\.(?=\n{2}|\Z)

它是如何工作的(大部分内容与前面的相同,所以我将只解释其中的区别):

  • (?:.|\n(?!\n))+可以匹配任何字符( \n除外,因为.不匹配换行符);如果后面没有另一个\n

,则可以匹配\n

选项3

这仅适用于PCRE或PyPi regex package。这比上面的其他选项效率更高-步骤比选项2少21%,比选项1少39%。此正则表达式使用re.DOTALL选项。

See regex in use here

代码语言:javascript
复制
(?:\A|\n{2})(?:\n{2}(*SKIP)(*FAIL)|.)+?\.(?=\n{2}|\Z)

它是如何工作的(同样,基本相同,只是解释一下不同之处):

  • (?:\n{2}(*SKIP)(*FAIL)|.)+?匹配以下任意一次或多次,但尽可能少(+? - lazy量词) regex匹配两个连续的换行符,然后失败((*SKIP)(*FAIL)就像魔术一样阻止正则表达式回溯到其当前位置,然后使当前匹配失败。简单地说,这将跳过(*SKIP)左侧匹配的所有字符(直到并包括\n\n),然后在该位置之后继续模式匹配(有关更多info).

,请参见this question

票数 3
EN

Stack Overflow用户

发布于 2020-06-27 02:40:04

这里有一个不需要任何模块的简单解决方案:

代码语言:javascript
复制
doc = '...'

ps = '\n\n'.join([p for p in d.split('\n\n') if not p.endswith('.')])

这将产生与原始文件完全相同的格式。

如果你想让它更整洁,可以使用

代码语言:javascript
复制
ps = '\n\n'.join([p for p in d.split('\n\n') if not p.endswith('.') and p.strip()])
票数 0
EN

Stack Overflow用户

发布于 2020-06-27 02:40:12

((.+\n)*(.*\.\n))应该做到这一点-- demonstrated here

(.+\n)捕获包含1个或多个字符的行(包括换行符

(.+\n)*零次或多次执行此操作

((.+\n)*(.*\.\n)),并且还包括后面有零个或多个字符的行,该行以句点结尾,然后是换行符

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62600748

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档