如何匹配直到第一次出现模式?

时间:2017-01-09 20:30:26

标签: python regex

我正在解析文件并试图提取文件中的多个部分。其中一个部分称为“报告”,单个文件可能包含多个报告。我想提取其中的每一个'报告'使用正则表达式从文件中的部分。

正面临的问题:

有多个部分以' -----'结尾,如何在第一次出现时停止?

当前正则表达式:

-+(\s+)?Report(\s+)?-+\n(.*\n)+\n-{72}

不幸的是,这个正则表达式将所有部分都作为一个部分进行匹配,而我打算在第一次出现时将其停止为“' ----”部分结束模式。

示例文件:

-----------报告-----------

Lorem ipsum dolor坐下来,精神上的adipistur elit。在eo M. Si longus,levis; Ita prorsus,inquam; Tu quidem reddes;比率quidem vestra sic cogit。 Duo Reges:建设相互联系。 Tum Torquatus:Prorsus,inquit,assentior

------------------------------

Putabam equidem满意,inquit,我dixisse。 Dicimus aliquem hilare vivere; Quonam,inquit,modo? Nescio quo modo praetervolavit oratio。

-----------报告-----------

在eo M. Sed quae tandem ista ratio est? Quoniam,si dis placet,ab Epicuro loqui discimus。 Venit ad极值;非连续的,非常无情的。

------------------------------

Illi enim inter se dissentiunt。 Equidem e Cn。在multis malis affectus。 Hoc loco tenere se Triarius non potuit。 Haec dicuntur inconstantissime。 Efficiens dici potest。

-----------分析-----------

Ato in eo M. Sed quae tandem ista ratio est? Quoniam,si dis placet,ab Epicuro loqui discimus。 Venit ad极值;非连续的,非常的。

----------------------------

注意:

  1. 结局' ----'模式有' - '重复72次
  2. ' ---报告---'之后总会有一个空行。在结束之前' ----'模式
  3. 正在使用的语言:Python

1 个答案:

答案 0 :(得分:2)

您可以使用

(?s)-+\s*Report\s*-+\n(.*?)\n-{72}

或者 - 因为---Report----从行的开头开始:

(?sm)^-+\s*Report\s*-+\n(.*?)\n-{72}

请参阅regex demo

<强>详情:

  • (?s) - 启用DOTALL模式
  • -+ - 1+连字符
  • \s* - 0+ whitespaces
  • Report - 文字字符的子字符串
  • \s* - 0+ whitespaces
  • -+ - 1+连字符
  • \n - 换行符
  • (.*?) - 捕捉第1组匹配任何0+字符,但尽可能少,直到第一个...
  • \n-{72} - 换行后跟72个连字符。

re.findall一起使用。