2009-02-08 175 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 

请注意,我规定比赛应该是全球性的,以获得所有事件。