2013-05-29 3 views
0

Задана строка, как \url{www.mywebsite.com/home/us/index.html}', я хотел бы заменить часть URL до второго до последнего косую черту с www.example.com/, так что она становится:Замена регулярных выражений с группами

\url{www.example.com/us/index.html}` 

Я полагаю, что по крайней мере одна косая черта существует в URL-адресе. Теперь это то, что я пробовал.

>>> pattern = r'(\url{).*([^/]*/[^/]*})' 
>>> prefix = r'\1www.example.com/\2' 
>>> re.sub(pattern, prefix, '\url{www.mywebsite.com/home/us/index.html}') 
'\\url{www.example.com//index.html}' 

Я не знаю, почему us часть не включается в результат, хотя я явно включал [^/]* внутри регулярного выражения.

ответ

1

Жадный .* соответствует всем до последней косой черты. Тогда ваша группа просто соответствует /index.html, с первым [^/]* ничего не соответствует (потому что * ничего не может сопоставить).

Включить косую черту после .*, чтобы заставить .* остановиться перед вторым до последнего слеша, предотвращая его потребляя us, что вы хотите оставить для группы захвата:

>>> pattern = r'(\url{).*/([^/]*/[^/]*})' 
>>> re.sub(pattern, prefix, '\url{www.mywebsite.com/home/us/index.html}') 
'\\url{www.example.com/us/index.html}' 
+0

Ах право! Или, альтернативно, я мог бы использовать ленивую версию 'pattern = r '(\ url {). *? ([^ /] */[^ /] *})'' –

+0

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

1

Также с помощью lookhead/просмотра назад:

import re 
# match anything that has a preceding '{' up to the last two slashes: 
pattern = r'(?<={).*(?=(?:[^/]*/){2})' 
prefix = r'www.example.com' 
print re.sub(pattern, prefix, '\url{www.mywebsite.com/home/us/index.html}') 

Выход

\url{www.example.com/us/index.html} 

или без использования регулярных выражений на все:

l='\url{www.mywebsite.com/home/us/index.html}'.split(r"/")[-2:] 
l=['\url{www.example.com', l[0], l[1]] 
print "/".join(l) 
+0

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

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