2008-10-06 9 views
3

Mon expression régulière doit être en mesure de trouver les cordes:Expression régulière: Correspond à (aa | bb) (cc)?

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

et une foule d'autres variantes similaires, à remplacer par celui-ci seule chaîne

Visual Studio 2005

J'ai essayé « Visual (Basic | C++ | Studio) (Express)? 2008" ., Mais il ne fonctionne pas Toutes les idées

Modifier: Maintenant, je l'ai essayé "? Visuel (Basic) | (C++) | (Studio) (Express) 2008", mais la ligne remplacé devient "Visual Studio 2005 Express 2008" pour l'entrée "Visual Basic Express 2008"

Répondre

7

Il devrait être

"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' 
+0

Merci, c'est la réponse. Parfois, regex peut être un peu confus :) – Graviton

+0

Wow, c'est exactement ce que j'ai dit, sans cuillère. O bien ... – leppie

+0

SO est plusieurs fois au sujet de spoonfeeding –

2

Vous devez échapper les caractères spéciaux (comme +) .Le bit "express" doit également avoir un espace de chaque côté.

3

Dans le cas sans un Express, vous cherchez 2 espaces avant l'année, ce n'est pas bon, essayez ceci:

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

En fonction de l'entrée, il pourrait être suffisant pour utiliser:

"Visual [^ ]+ (Express)?2008" 
2

Essayez ceci: "Visuel (base | C \ + \ + | Studio) (Express) 2008"

0

Essayez avec:

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

qui est, je cite le « + » de « C++ » et inclure l'espace dans « Express »

Comme il est Python et vous n'avez pas besoin des pièces parenthésées:

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

Ceci est plus explicite avec des espaces:

Visual\s(Basic|C\+\+|Studio)(\sExpress)?\s2008 
1

à moins que votre entrée de l'échantillon est criblé de toutes sortes de permutations de vos mots-clés, vous pourriez simplifier énormément avec ceci:

Visual .+? 2008 
+0

Cela aurait besoin d'un quantificateur non gourmand, au cas où votre entrée a deux instances de 2008 ... comme Visual. +? 2008 –

+0

Bonne prise. J'ai modifié le post pour refléter votre changement. – indiv

1

Je pense que cela devrait fonctionner

/visual (studio|basic|c\+\+)? (express)?\s?2008/i 
Questions connexes