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

4

我有一个正则表达式,可以去掉请求URL的结尾:

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

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

/en/category/specials/men-2610

我不确定Python在做什么,但是我的正则表达式似乎没问题。 < p>编辑:我希望将字符串的结尾去掉,目标=

/en/category/specials/men

2
将您的模式定义为原始字符串。 - Avinash Raj
1
是的,它替换整个字符串,因为整个字符串被匹配。 - Avinash Raj
2
你期望的输出是什么? - Avinash Raj
你想要移除什么? - vks
5个回答

3
如文档所述,将替换匹配的部分匹配捕获不同。
您需要使用捕获组捕获您不想删除的文本,方法如下:
(^/en/category.*)-\d{1,4}$

使用反向引用 \1 将其放回字符串中:

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

谢谢你解释了匹配和捕获的区别,我之前不知道它们是如何处理的。 - Tjorriemorrie

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

尝试使用\1替换this.replace。请查看演示。https://regex101.com/r/tX2bH4/27。您的整个模式匹配,因此它替换了整个字符串。P.S. matchcaptures或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

可以翻译为:

{{链接1:演示}}


>>> 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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接