匹配不以已知字符串列表结尾的字符串
我想匹配街道名称,这些名称可能会有“ St/Ave/Road”这样的后缀。这个后缀可能根本不存在,所以有时候它可能只是“1st”。我还想知道这个后缀是什么。请问有什么合适的正则表达式可以用吗?我试过:
(.+)(\s+(St|Ave|Road))?
但是看起来第一个组贪婪地匹配了整个字符串。我尝试使用回顾(?<!
),但没能正确使用,因为它总是报错,比如“look-behind requires fixed-width pattern
”。
如果有关系的话,我是在用Python。
有什么建议吗?
4 个回答
0
负向前查找怎么样呢:
(?!<=(St|Ave|Road))$
看起来它能很准确地表达这个需求。
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
4
只需要在你的第一个分组后面加个问号,这样就可以让它变得不贪婪了:
(.+?)(\s+(St|Ave|Road))?