2015-01-16 7 views
2

У меня есть регулярное выражение раздеться конец от запроса URL:Python Regex заменить всю строку

re.sub('(?:^\/en\/category).*(-\d{1,4}$)', '', r) 

Моя проблема заключается в том, что документы говорят, он заменит совпадающую часть, однако, когда он соответствует моей строки он заменяет вся строка, например:

/en/category/specials/men-2610 

Я не уверен, что делает Python, но my regex seems fine

EDIT: Я хотел бы иметь строку с конца содранной, целевой =

/en/category/specials/men 
+2

определить свой шаблон в качестве исходной строки. –

+1

yep, он заменяет всю строку, потому что вся строка сопоставляется. –

+2

Каков ваш ожидаемый результат? –

ответ

2

Как указано в документации, то соответствует части заменяется. Соответствует не соответствует снято.

Вы должны захватить текст сделать не хотите удалить в группе захвата, как так:

(^/en/category.*)-\d{1,4}$ 

и положить его обратно в строку с помощью обратной ссылки \1:

re.sub(r'(^/en/category.*)-\d{1,4}$', r'\1', text) 
+0

Спасибо за объяснение о совпадающих и захваченных. Я не знал, как это было обработано. – Tjorriemorrie

2
(?<=^\/en\/category)(.*)-\d{1,4}$ 

Try this.replace по \1 .Увидь демо.

https://regex101.com/r/tX2bH4/27

Ваш весь шаблон совпадает, поэтому он заменяет всю строку.

P.S match не соответствует captures or groups.

import re 
p = re.compile(r'(?<=^\/en\/category)(.*)-\d{1,4}$', re.IGNORECASE) 
test_str = "/en/category/specials/men-2610" 
subst = "\1" 

result = re.sub(p, subst, test_str) 
1

Просто перевести группу захвата на другую часть, а затем заменить матч с \1 и вам не нужно, чтобы избежать слэш, если модель определяется как сырьевой строки.

re.sub(r'^(/en/category.*)-\d{1,4}$', r'\1', string) 

DEMO

>>> s = "/en/category/specials/men-2610" 
>>> re.sub(r'^(/en/category.*)-\d{1,4}$', r'\1', s) 
'/en/category/specials/men' 

ИЛИ

>>> s.split('-')[0] 
'/en/category/specials/men' 
1
>>> re.sub('(^\/en\/category.*)(-\d{1,4}$)', 
      r'\1', '/en/category/specials/men-2610') 
'/en/category/specials/men' 
1

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

До:

(?:^\/en\/category).*(-\d{1,4}$) 

После:

((?:^\\/en\\/category).*)-\\d{1,4}$ 

Поскольку ?: больше нет необходимости, мы можем уменьшить это далее:

(^\\/en\\/category.*)-\\d{1,4}$ 

Обратите внимание, я переместил группу захвата из цифр перед ним.

Пример:

http://ideone.com/FLAaFh

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