正则表达式匹配某些模式或预定义字符串

时间:2010-12-17 17:20:05

标签: python regex

我有两个字符串:

a = 'B E R L I N IS A CITY'
b = 'PARIS IS A CITY, TOO'

我希望匹配第一个单词,以防它是单个空格或预定义单词。

我提出的正则表达式(Python)是

regex = re.compile('^(?P<city>([a-z] )*|(paris )).*$', re.IGNORECASE)
print regex.match(a).group('city'), regex.match(b).group('city')
>>>> ('B E R L I N ', '')

Paris未匹配。但当我转过正则表达式时,

regex = re.compile('^(?P<city>(paris )|([a-z] )*).*$', re.IGNORECASE)
print regex.match(a).group('city'), regex.match(b).group('city')
>>>> ('B E R L I N ', 'PARIS ')

Paris正在匹配。我错过了什么?

2 个答案:

答案 0 :(得分:5)

“问题”是当^([a-z] )*重复零次时PARIS …匹配字符串[a-z] 的开头。因此,正则表达式解释器无需测试文字paris 

使用+代替+,它可以正常运行:

^(?P<city>([a-z] )+|(paris )).*$

答案 1 :(得分:2)

使用span()经常会对问题产生影响,

import re

regex = re.compile('^(?:((?:[a-z] )*)|(paris )).*$', re.IGNORECASE)

a = 'B E R L I N IS A CITY'
b = 'PARIS IS A CITY, TOO'
for x in (a,b):
    print x
    print 'span(1)==',regex.match(x).span(1),'  span(2)==',regex.match(x).span(2)
    print

结果是:

B E R L I N IS A CITY
span(1)== (0, 12)   span(2)== (-1, -1)

PARIS IS A CITY, TOO
span(1)== (0, 0)   span(2)== (-1, -1)