我有一个正则表达式来删除请求的结尾:
re.sub('(?:^\/en\/category).*(-\d{1,4}$)', '', r)
我的问题是文档说它会替换匹配的部分,但是当它匹配我的字符串时它会替换整个字符串,例如:
/en/category/specials/men-2610
我不确定Python在做什么,但是my regex seems fine
编辑:我希望删除结尾的字符串,target =
/en/category/specials/men
答案 0 :(得分:2)
(?<=^\/en\/category)(.*)-\d{1,4}$
请\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 :(得分: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)
>>> 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}$
注意我已经将捕获组从数字移动到它之前的部分。
示例: