簡體   English   中英

Python正則表達式替換整個字符串

[英]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 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)

如文檔中所述, 匹配的部分被替換。 匹配捕獲不同。

你必須抓住你不想在捕獲組,除去像這樣的文字:

(^/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)

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'
>>> 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}$

注意我已經將捕獲組從數字移動到它之前的部分。

例:

http://ideone.com/FLAaFh

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM