2009-02-08 38 views
34

正則表達式是否可以匹配空格字符串的開始?正則表達式:匹配開頭或空格

我試圖取代貨幣與£符號縮寫英鎊。我可以匹配任何以英鎊開始的東西,但我希望稍微保守些,並尋找周圍的某些分隔符。

>>> import re 
>>> text = u'GBP 5 Off when you spend GBP75.00' 

>>> re.sub(ur'GBP([\W\d])', ur'£\g<1>', text) # matches GBP with any prefix 
u'\xa3 5 Off when you spend \xa375.00' 

>>> re.sub(ur'^GBP([\W\d])', ur'£\g<1>', text) # matches at start only 
u'\xa3 5 Off when you spend GBP75.00' 

>>> re.sub(ur'(\W)GBP([\W\d])', ur'\g<1>£\g<2>', text) # matches whitespace prefix only 
u'GBP 5 Off when you spend \xa375.00' 

我可以同時做兩個後面的例子嗎?

+0

這是哪一種語言?它是Perl嗎? – 2009-02-08 13:02:13

+0

Python。 – 2009-02-08 13:03:43

+0

是的,但不管怎樣,概念都是一樣的。 – Mat 2009-02-08 13:14:01

回答

38

使用OR 「|」 運營商:

>>> re.sub(r'(^|\W)GBP([\W\d])', u'\g<1>£\g<2>', text) 
u'\xa3 5 Off when you spend \xa375.00' 
24

\b是字邊界,可以是空格,行的開頭或非字母數字符號(\bGBP\b)。

1

是的,爲什麼不呢?

re.sub(u'^\W*GBP... 

字符串,0個或多個空格,然後GBP ...

編輯開始匹配:哦,我想你想的交替,使用|

re.sub(u'(^|\W)GBP... 
0

在搜索之前,您始終可以修改標記中的前導空格和尾部空白,以確定它不是需要全行的匹配/分組情形。

6

這取代了英鎊,如果它是由一個字符串的開頭或word boundary(其中一個字符串的開始已經是)之前,和英鎊之後而來的數值或一個單詞邊界:

re.sub(u'\bGBP(?=\b|\d)', u'£', text) 

這通過使用lookahead消除了對任何不必要的反向參考的需求。包容不夠?

2

我認爲你正在尋找'(^|\W)GBP([\W\d])'

0

它的工作原理在Perl:

$text = 'GBP 5 off when you spend GBP75'; 
$text =~ s/(\W|^)GBP([\W\d])/$1\$$2/g; 
printf "$text\n"; 

輸出是:

$ 5 off when you spend $75 

請注意,我規定比賽應該是全球性的,以獲得所有事件。