![](/img/trans.png)
[英]Regular expression [REGEX] - substitution / replace - Contents in capture group 1 & 2
[英]Substitution by regular expression in Python
考慮Python片段:
import re
str = 'that that kitty is cute'
# Anchor at beginning of string
rgexp_start = r'^(.*) \1'
print(re.sub(rgexp_start, r'\1', str))
# Do NOT anchor at beginning of string
rgexp = r'(.*) \1'
print(re.sub(rgexp, r'\1', str))
這打印:
that kitty is cute
thatkittyiscute
為什么第二個正則表達式會刪除所有空格? 還有一個問題,請考慮JavaScript代碼段:
var str = 'that that kitty is cute';
var rgexp_start = /^(.*) \1/;
alert(str.replace(rgexp_start, '$1'));
var rgexp = /(.*) \1/;
alert(str.replace(rgexp, '$1'));
哪兩次給出:
that kitty is cute
為什么JavaScript在處理相同的正則表達式時與Python不同?
要回答您的第一個問題, re.sub
將完全替換您傳遞的模式。
因此, r'^(.*) \\1'
表示替換從頭開始的所有重復項。 既然你已經指定匹配從頭開始,並且因為字符串只有一個開頭,那么唯一能找到匹配和替換的東西就是'^that that'
,所以就完成了。
In[]: 'that that kitty is cute'
'^that that' -> 'that'
Out[]: 'that kitty is cute'
在r'(.*) \\1'
, .*
實際上可以匹配0個或更多個字符 。 這很重要,因為現在正則表達式不再受限於開始了。 所以它的作用是,除了'^that that
'(第一個正則表達式也做)之外,它匹配''
,然后是空格,然后''
再次匹配,總共3次。 因此,它將替代' '
(帶有空格''
與(空字符串兩側)) ''
。
In[]: 'that that kitty is cute'
'that that' -> 'that'
' ' -> ''
' ' -> ''
' ' -> ''
Out[]: 'thatkittyiscute'
要回答你的第二個問題,b / w python和JS的區別,正如anubhava所解釋的那樣,默認情況下不啟用JS中的全局標志; 只發生第一次更換,保持字符串的其余部分不變。
Javascript行為是不同的,因為您沒有在Javascript正則表達式中打開global
或g
標志(默認情況下在python中打開)。
如果你使用與g
標志相同的正則表達式:
var rgexp = /(.*) \1/g;
console.log(str.replace(rgexp, '$1'));
然后它將打印:
thatkittyiscute
這與python
行為相同。
順便說一下,如果你使用這個略有不同的正則表達式:
(\S+) \1
然后,即使沒有錨,它也會在更換后始終打印出來,如第一個例子中所示:
that kitty is cute
\\S+
匹配一個或多個非空白字符。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.