2016-11-29 4 views
0
regular_expression = re.compile(r'SKIPPED|PASSED|FAILED') 
regular_expression.search(line) 

正規表現使って言葉の一つだけにマッチする方法(スキップ| PASSED | FAILED)Pythonの:上記の正規表現は、言葉の一つが持っているすべての行選択します

問題があるの:それは選択次の行も

TYPE TOTAL SKIPPED  PASSED FAILED 
---- ----- -------  ------ ------ 

Module 21  0   19  3 

3つの単語のうちの1つが存在する場合にのみ、その行が選択されるようにしますか?

+1

。 *(?:(スキップされていますか?失敗しましたか?)*(?:スキップされました。 /regex101.com/r/oo2kOi/1)。 –

+0

@WiktorStribiżew:見晴らしの良いゴルフをお楽しみください。私から+1を得る。 –

+0

@SebastianLenartowicz:式の* lookahead *は、いわゆる[*テンダードグリーディトークン*](http://www.rexegg.com/regex-quantifiers.html#tempered_greed)の一部です。 –

答えて

1

誰もまともには、生産コードで正規表現でこれを行うことをお勧めしますが、完全を期すために、ここでpositive and negative lookaheadsを使用しての答えです:

^(?:(?=.*PASSED)(?!.*(?:FAILED|SKIPPED))|(?=.*FAILED)(?!.*(?:PASSED|SKIPPED))|(?=.*SKIPPED)(?!.*(?:FAILED|PASSED))) 

基本的には、何それはやることはそれを確実にするために先に見ています文字列に必要な単語のいずれかが含まれている場合は、もう一度見て、それが他の2つのいずれも含まれていないことを確認します。

Demo on Regex101

1

方法代わりにre.findallの使用についてのみ1項目の試合をチェックし、試合唯一の真のそれは本当に正規表現せずに容易にあるときにre.findallリターンのみの単一のマッチ項目

regular_expression = re.compile(r'SKIPPED|PASSED|FAILED') 
match = len(regular_expression.findall(line)) == 1 
関連する問題