匹配不以已知字符串列表结尾的字符串

时间:2011-06-08 06:32:05

标签: python regex

我想匹配街道名称,可以采用“St / Ave / Road”的形式。后缀可能根本不存在,因此它可能只是“第一”。我也想知道后缀是什么。什么是合适的正则表达式?我试过了:

(.+)(\s+(St|Ave|Road))?

但似乎第一组贪婪地匹配整个字符串。我试着回顾一下(?<!),但无法让它正常工作,因为它一直存在“look-behind requires fixed-width pattern”之类的喷出错误。

如果它很重要,我正在使用Python。

有什么建议吗?

4 个答案:

答案 0 :(得分:4)

只需添加问号即可让您的第一组不贪婪:

(.+?)(\s+(St|Ave|Road))?

答案 1 :(得分:3)

作为基于正则表达式的解决方案的替代方案,如何:

suffix = s.split(' ')[-1]
if suffix in ('St', 'Ave', 'Road'):
  print 'suffix is', suffix
else:
  print 'no suffix'

如果你必须使用正则表达式,只需使第一个匹配非贪婪,例如:r'.*?\s+(St|Ave|Road)$'

In [28]: print re.match(r'(.*?)\s+(St|Ave|Road)$', 'Main Road')
<_sre.SRE_Match object at 0x260ead0>

In [29]: print re.match(r'(.*?)\s+(St|Ave|Road)$', 'nothing here')
None

答案 2 :(得分:0)

你想要负面展望

(?!(St|Ave|Road))$

答案 3 :(得分:0)

背后的负面看法如何:

(?!<=(St|Ave|Road))$

似乎要严格表达要求