使用python正则表达式捕获关键字后的一到三个单词

时间:2017-12-01 15:42:22

标签: python-2.7

我想在我的关键字之后捕获一到三个单词但我的一些情况并没有返回所有单词。以下是三个示例字符串和预期输出:

  • "等待5小时1分2秒"到[' 5h 1m 2s']
  • "等待5小时1分钟"至[' 5h 1m']
  • "等待1米"到[' 1m']

我正在尝试使用正则表达式,因为示例字符串可能是更复杂行的一部分。这是我的代码:

In [51]: ex = re.compile('wait (?:A\s)?(\w+\s?\w+?\s?\w+?\s?)', re.IGNORECASE)

In [52]: ex.findall("wait 5h 1m 2s")

Out[52]: ['5h 1m ']

In [53]:ex.findall("wait a 5h 1m")

Out[53]: ['5h 1m']

In [54]: ex.findall("wait 5h")

Out[54]: []

为什么正则表达式在等待'和两个可选的单词?

1 个答案:

答案 0 :(得分:0)

问题在于这一部分:

\w+?\s?\w+?

\w+?的出现并非贪婪,因此有效地表示"尽可能少的单词字符(但至少有一个)"。当你在它们之间放置一个可选空格(\s?)时,得到的是第一个\w+?匹配,例如,"1",跳过可选空格,然后是第二个{{1}匹配\w+?。因此"m"被有效地解释为两个"单词"。

这对于1m重复符号来说是一个很好的应用:

{}

>>> ex = re.compile('wait (?:A\s)?((?:\w+\s*){1,3})', re.IGNORECASE) >>> ex.findall("wait 5h 1m 2s") ['5h 1m 2s'] >>> ex.findall("wait a 5h 1m") ['5h 1m'] >>> ex.findall("wait 5h") ['5h'] 表示"匹配此次1-3次"。而且,由于你贪婪地抓住每一个字中的所有单词字符,你可以提供" optional"空格为{1,3},以确保缺少尾随空间不会让你失望。