首页 > 解决方案 > 正则表达式逐行匹配并在出现特定字符串时停止

问题描述

我正在使用repython,我无法让我的逻辑解决这个问题。我的文字如下:

(...)
 Zelite and FOS ont are limiting small bowel disturbance. 
Indications :
chronical kidney disease (IRC)
management of urolithiasis and low tract urinary syndrome
hepatic encephalitis
management of acidophils urinary stone : purine, cystine…
Contraindication :
pregnancy, lactation, growth
Length of the treatment : ... 
(...)

我只想在适应症和禁忌症之间找到一些东西。每行将是另一组。

到目前为止,我几乎满意,但事实并非如此:

([I,i]ndication[s]*\s*\:{0,1})(\s*.*\n)*? Contraindication

这给了我:

Indications :
    chronical kidney disease (IRC)
    management of urolithiasis and low tract urinary syndrome
    hepatic encephalitis
    management of acidophils urinary stone : purine, cystine…
 Contraindication

我想摆脱“禁忌症”,但消极的前瞻似乎不适用于:?. 我不知道为什么。.replace("Contraindication","") 总是可能的,但我正在寻找合适的正则表达式解决方案。
我不知道使用正则表达式是否可行,但是可以在不事先知道会有多少行的情况下为每行(在适应症和禁忌症之间)设置一个组?

您可以在 Regex 模拟器上查看我在此处所做的操作

祝你有美好的一天

标签: regexpython-3.x

解决方案


否定的前瞻将匹配一个跟随前瞻中的任何内容的字符串。积极的前瞻性是您想要的。这将匹配一个字符串,该字符串后跟前瞻的任何内容,而不包括匹配中的前瞻。在这种情况下,您可以这样做:

(?s)(?<=[iI]ndications :).*(?=Contraindication)

正如您在此处看到的,它准确地捕获了您想要的内容。

为了为您分解这一点,(?s)启用单行标志,(?<=[iI]ndications :)匹配前面有indications :or的字符串Indications :

.*捕捉介于两者之间的一切

并且(?=Contraindication)表示字符串后面必须跟Contraindication

前瞻或后瞻都不包括在匹配中。如果您还想包括单词指示,只需删除它(?<=)周围的。


推荐阅读