簡體   English   中英

在Python中用正則表達式替換

[英]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正則表達式中打開globalg標志(默認情況下在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.

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