2015-02-23 2 views
1

Я пытаюсь захватить идентификатор и имя в шаблоне, подобном этому @ [123456] (John Smith), и использовать их для создания строки, например, < a href = "123456"> John Smith </a>.Python Regex to capture @ [123456] (John Smith)

Вот что я пробовал, но он не работает.

def format(text): 

    def idrepl(match): 
     fbid = match.group(1) 
     name = match.group(2) 
     print fbid, name 
     return '<a href="https://www.facebook.com/{}">{}</a>'.format(fbid, name) 

    return re.sub(r'\@\[(\d+)\]\[(\w\s+)\]', idrepl, text) 
+0

Ваше регулярное выражение не соответствует вашему входу. В соответствии с вашим регулярным выражением вы пытаетесь сопоставить '@ [123456] [John Smith]', а не '@ [123456] (John Smith)' – MattDMo

ответ

4

Часть

(\w\s+) 

матчи ровно один символ слова следуют 1+ пробельных символов.

Очевидно, что это не , что вы хотите, и это легко исправить:

([\w\s]+) 

«один или несколько символов, каждый из которых представляет собой слово или символ пробела».

ли это на самом деле, что вы хотите, я не уверен, - это будет счастливо соответствовать John Smith, но не например Maureen O'Hara (что апостроф будет препятствовать спичку) или John V. Smith (здесь, это точка что помешает матчу) или John Smith-Passell (вот, это тире).

В общем, люди называют свои имена потенциально несколькими символами пунктуации (а также слово-символы и пробелы) - апострофы, точки, тире и многое другое. Если вам не нужно объяснять это, тогда, отлично! -) Если вы do, жизнь становится немного сложнее (придерживаться этих символов в квадратных скобках выше будет в основном, но необходимы меры предосторожности - например, тире , если вам нужно, чтобы он был частью набора символов в скобках, должен быть в конце, непосредственно перед закрывающей скобкой).