Python正则表达式替换整个字符串

时间:2015-01-16 11:30:30

标签: python regex

我有一个正则表达式来删除请求的结尾:

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

我的问题是文档说它会替换匹配的部分,但是当它匹配我的字符串时它会替换整个字符串,例如:

/en/category/specials/men-2610

我不确定Python在做什么,但是my regex seems fine

编辑:我希望删除结尾的字符串,target =

/en/category/specials/men

5 个答案:

答案 0 :(得分:2)

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

\1尝试此。替换。请参阅演示。

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

你的整个模式匹配就是它替换整个字符串的原因。

P.S matchcaptures 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 :(得分:2)

如文档中所述,匹配的部分已被替换。 匹配已捕获不同。

您必须捕获想要在捕获组中删除的文本,如下所示:

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

并使用反向引用\1

将其放回字符串中
re.sub(r'(^/en/category.*)-\d{1,4}$', r'\1', text)

答案 2 :(得分: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'

OR

>>> s.split('-')[0]
'/en/category/specials/men'

答案 3 :(得分:1)

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

答案 4 :(得分:1)

您的模式很好,您只需要更改哪个项目是捕获组:

在:

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

后:

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

由于不再需要?:,我们可以将其进一步减少为:

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

注意我已经将捕获组从数字移动到它之前的部分。

示例:

http://ideone.com/FLAaFh