2014-10-17 85 views
0

我完全失去了這種正則表達式匹配這個字符串在Python中。有人可以理解它嗎?Python的正則表達式匹配字符串,它不應該

import re 
regex = "^PHP/5.\\{3|2\\}.\\{1|2|3|4|5|6|7|8|9|0\\}\\{1|2|3|4|5|6|7|8|9|0\\}$" 
ua = 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)' 
re.compile(regex).search(ua) 

正則表達式以PHP開頭,而字符串不是。難道這不應該讓比賽不再發生?

回答

5

您需要分組(最好非捕獲)爲您的交替:

PHP/5.\\{(?:3|2)\\}.\\{(?:1|2|3|4|5|6|7|8|9|0)\\}\\{(?:1|2|3|4|5|6|7|8|9|0)\\}$ 
     ^^ ^  ^^     ^ ^^     ^

其他明智的,你會被交替整個表達式:

  • PHP/5.\\{3
  • 2
  • \\}.\\{1
  • 2
  • 3
  • 4
  • 5找到匹配!

認爲PEMDAS和嵌套的條件(if(a && (b || c)) { })。

+1

謝謝你幫我打10k的代表! :) – Sam 2014-10-17 21:08:38

4

您的RegEx失敗,因爲|在此扮演重要角色。所以,你的字符串匹配的項目,像這樣

  • ^PHP/5.\\{3

  • 2\\}.\\{

等。由於54|5|6,它實際上匹配5Mozilla/5.0

你可以在線演示和解釋相同的,here

Regular expression visualization

Debuggex Demo