2014-10-17 2 views
0

Я полностью потерял, как это регулярное выражение соответствует этой строке в python. Может ли кто-нибудь это понять?Python regex соответствует строке не должно

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

4

Ваш RegEx терпит неудачу, потому что | играет здесь важную роль. Таким образом, ваша строка соответствует для элементов, как этот

  • ^PHP/5.\\{3

  • 2\\}.\\{

и так далее. Так как или соответствует 5 в 4|5|6, он фактически соответствует 5 в Mozilla/5.0.

Вы можете увидеть онлайн демо-версию и объяснение тем же, here.

Regular expression visualization

Debuggex Demo

Смежные вопросы