模式的懒惰匹配

时间:2018-03-31 19:32:08

标签: python regex regex-lookarounds

给定字符串1.blah blah2.yada yada我想提取1.blah blah2.yada yada。我尝试了这个\d\..+,但它匹配整个字符串。 \d\..+?匹配1.b2.y。我只需要懒洋洋地匹配模式。有什么想法吗?

1 个答案:

答案 0 :(得分:1)

模式结尾处的.+匹配除了换行符之外的所有1 +字符,直到字符串/行结束。模式末尾的.+?只匹配1个字符(但它是必需的),因为+?是一个惰性量词,只需要1个字符。

您可以使用

\d+\..*?(?=\d+\.|$)

请参阅regex demo。如果字符串中可以有换行符,请添加re.DOTALL修饰符。

<强>详情

  • \d+ - 1+位数
  • \. - 一个点
  • .*? - 除了换行符之外的任何0+字符(如果使用re.DOTALL,甚至包括换行符),尽可能少,直至(但不包括)第一次出现...
  • (?=\d+\.|$) - (与两个备选方案中的任何一个匹配的正向前瞻:) 1+位数,然后是.或字符串结尾。

Python演示:

import re
rx = r"\d+\..*?(?=\d+\.|$)"
s = "1.blah blah2.yada yada3.yadddaaa"
print(re.findall(rx, s))
# => ['1.blah blah', '2.yada yada', '3.yadddaaa']

请参阅Python demo