Регулярное выражение: соответствует (aa | bb) (cc)? - PullRequest
3 голосов
/ 06 октября 2008

Мое регулярное выражение должно быть в состоянии найти строки:

  1. Visual Studio 2008
  2. Visual Studio Express 2008
  3. Visual Basic 2008
  4. Visual Basic Express 2008
  5. Visual C ++ 2008
  6. Visual C ++ Express 2008

и множество других подобных вариантов, которые должны быть заменены этой единственной строкой

Visual Studio 2005

Я пробовал «Visual (Basic | C ++ | Studio) (Express)? 2008», но он не работает. Есть идеи?

Редактировать : Теперь я попробовал «Visual (Basic) | (C ++) | (Studio) (Express)? 2008», но замененная строка становится «Visual Studio 2005 Express 2008» для ввода «Visual Basic Express 2008».

Ответы [ 9 ]

7 голосов
/ 06 октября 2008

должно быть

"Visual (Basic|C\+\+|Studio)( Express)? 2008"

>>> import re
>>> repl = 'Visual Studio 2005'
>>> regexp = re.compile('Visual (Studio|Basic|C\+\+)( Express)? 2008')
>>> test1 = 'Visual Studio 2008'
>>> test2 = 'Visual Studio Express 2008'
>>> test3 = 'Visual C++ Express 2008'
>>> test4 = 'Visual C++ Express 1008'
>>> re.sub(regexp,repl,test1)
'Visual Studio 2005'
>>> re.sub(regexp,repl,test2)
'Visual Studio 2005'
>>> re.sub(regexp,repl,test3)
'Visual Studio 2005'
>>> re.sub(regexp,repl,test4)
'Visual C++ Express 1008'
3 голосов
/ 06 октября 2008

В случае без экспресса вы ищете 2 пробела до года. Это не хорошо. Попробуйте это:

"Visual (Basic|C\+\+|Studio) (Express )?2008"

В зависимости от входа может быть достаточно использовать:

"Visual [^ ]+ (Express )?2008"
2 голосов
/ 06 октября 2008

Попробуйте это: «Visual (Basic | C \ + \ + | Studio) (Express)? 2008»

2 голосов
/ 06 октября 2008

Вам нужно экранировать специальные символы (например, +). Также бит 'express' должен иметь пробел с каждой стороны.

1 голос
/ 06 октября 2008

я думаю, что это должно работать

/visual (studio|basic|c\+\+)? (express)?\s?2008/i
1 голос
/ 06 октября 2008

Если ваш выборочный ввод не пронизан всевозможными перестановками ваших ключевых слов, вы можете упростить его очень с помощью этого:

Visual .+? 2008
0 голосов
/ 29 октября 2014

Очень поздний ответ, но нравится отвечать. Вы можете просто попробовать это

/Visual.*2008/g

http://regex101.com/r/fI0yU1/1

0 голосов
/ 06 октября 2008

Это более явно с пробелами:

Visual\s(Basic|C\+\+|Studio)(\sExpress)?\s2008
0 голосов
/ 06 октября 2008

Попробуйте с:

Visual (Basic|C\+\+|Studio)( Express)? 2008

, то есть заключите в кавычки '+' 'C ++' и включите пробел в "Express"

Так как это Python и вам не нужны заключенные в скобки части:

Visual (?:Basic|C\+\+|Studio)(?: Express)? 2008
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...