我想在我的关键字之后捕获一到三个单词但我的一些情况并没有返回所有单词。以下是三个示例字符串和预期输出:
我正在尝试使用正则表达式,因为示例字符串可能是更复杂行的一部分。这是我的代码:
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]: []
为什么正则表达式在等待'和两个可选的单词?
答案 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}
,以确保缺少尾随空间不会让你失望。