[英]Python regex replace whole string
我有一個正則表達式從請求URL剝離結束:
re.sub('(?:^\/en\/category).*(-\d{1,4}$)', '', r)
我的問題是文檔說它將替換匹配的部分,但是當它匹配我的字符串時它會替換整個字符串 ,例如:
/en/category/specials/men-2610
我不確定Python在做什么,但我的正則表達式看起來很好
編輯 :我希望將結束剝離的字符串,target =
/en/category/specials/men
(?<=^\/en\/category)(.*)-\d{1,4}$
試試這個。替換\\1
參見演示。
https://regex101.com/r/tX2bH4/27
您的整個模式匹配,這就是它替換整個字符串的原因。
PS 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)
如文檔中所述, 匹配的部分被替換。 匹配與捕獲不同。
你必須抓住你不想在捕獲組,除去像這樣的文字:
(^/en/category.*)-\d{1,4}$
並使用反向引用\\1
將其放回到字符串中:
re.sub(r'(^/en/category.*)-\d{1,4}$', r'\1', text)
只需將捕獲組轉移到另一部分,然后將匹配替換為\\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'
要么
>>> s.split('-')[0]
'/en/category/specials/men'
>>> re.sub('(^\/en\/category.*)(-\d{1,4}$)',
r'\1', '/en/category/specials/men-2610')
'/en/category/specials/men'
您的模式很好,您只需要更改哪個項目是捕獲組:
之前:
(?:^\/en\/category).*(-\d{1,4}$)
后:
((?:^\\/en\\/category).*)-\\d{1,4}$
由於不再需要?:
我們可以進一步減少:
(^\\/en\\/category.*)-\\d{1,4}$
注意我已經將捕獲組從數字移動到它之前的部分。
例:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.