我有两个字符串:
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
正在匹配。我错过了什么?
答案 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)