2012-05-19 3 views
2

У меня есть этот код:Справка по использованию Regex Python?

import re 
#TEST CASES 
match_dict = ['hello(here)', 
      'Hello (Hi)', 
      "'dfsfds Hello (Hi) fdfd' Hello (Yes)", 
      "Hello ('hi)xx')", 
      "Hello ('Hi')"] 
for s in match_dict: 
    print "INPUT: %s" % s 
    m = re.sub(r"(?<!\()'[^']+'", '', s, flags=re.M) 
    paren_quotes = re.findall(r"Hello\s*\('([^']+)'\)", m, flags=re.M) 
    output = paren_quotes if paren_quotes else [] 
    m = re.sub(r"Hello\s*\('[^']+'\)", '', m, flags=re.M) 
    paren_matches = re.findall(r"Hello\s*\(([^)]+)\)", m, flags=re.M) 
    if paren_matches: 
     output.extend(paren_matches) 
    print 'OUTPUT: %s\n' % output 

Этот код сделан для вывода все в скобках после слова «Hello»,

Hello (Hi) would give 'Hi' 

Моя проблема заключается в том, что когда я ставлю в:

Hello('Hi')  

... Он по-прежнему возвращает 'Hi', когда я хочу, чтобы он вернулся "'Hi'"

Кто-нибудь знает, как я могу исправить этот код?

+0

Пожалуйста, используйте соответствующее название, которое вскоре описывает вашу проблему. Мы знаем, что вам нужна помощь, иначе вы не спросите. Мы также знаем, что ваш вопрос касается регулярных выражений и Python, поскольку он помечен как таковой. –

+0

Итак ... Вы пытаетесь захватить текст между круглыми скобками? –

+2

Я ошибаюсь, или это похоже на сложный подход к цели? – jdi

ответ

5

Просто использовать не жадное соответствие:

matches = re.search(r'^Hello\s*\((.*?)\)', text) 
+0

. Этот тестовый пример не должен работать: «Привет (f)», не должно быть ничего, потому что оператор Hello находится в кавычках – user1357159

+2

Почему это так сложно? – Blender

+0

@ user1357159: Я думаю, что независимо от того, что вы предлагаете о правилах, Blender просто собирается изменить регулярное выражение в соответствии с меньшим количеством кода, чем вы пытались. – jdi

2
>>> import re 
>>> p = re.compile(r'Hello\s*\((.*?)\)', re.M) 
>>> m = p.findall("Hello ('Hi')") 
>>> print m 
["'Hi'"] 
>>> m = p.findall("'dfsfds Hello (Hi) fdfd' Hello (Yes)") 
>>> print m 
['Hi', 'Yes'] 
+0

Спасибо за ваш ответ! – user1357159

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