【发布时间】:2018-01-10 18:49:39
【问题描述】:
我有一个看起来像这样的字符串:
phrase = '5 hampshire road bradford on avon avon dinas powys powys north somerset hampshire avon'
我想返回一个删除了某些单词的新字符串,前提是它们前面没有某些其他单词。
例如,我要删除的单词是:
c_out = ["avon", "powys", "somerset","hampshire"]
只有在他们不关注的情况下:
c_except = ["on\s","dinas\s"]
注意:c_out 中可能有多个单词实例,c_except 中可能有多个单词实例。
我个人尝试了'on\s':
phrase = '5 hampshire road bradford on avon avon dinas powys powys north somerset hampshire avon'
regexp1 = re.compile(r'(?<!on\s)(avon|powys|somerset|hampshire)')
print("1st Result: ", regexp1.sub('', phrase))
1st Result: '5 road bradford on avon avon dinas north'
这正确地忽略了第一个'avon',因为它前面是'on\s',它正确地删除了第三个'avon',但是它忽略了第二个'avon'(它没有删除)。
同理,对于'dinas\s':
phrase = '5 hampshire road bradford on avon avon dinas powys powys north somerset hampshire avon'
regexp2 = re.compile(r'(?<!dinas\s)(avon|powys|somerset|hampshire)')
print("2nd Result: ", regexp2.sub('', phrase))
2nd Result: '5 road bradford on dinas powys north '
这会正确地忽略第一个'powys' 并删除第二个(注意'... powys north' 之间的双空格。
我尝试通过以下方式组合这两个表达式:
regexp3 = re.compile(r'((?!on\s)|(?!dinas\s))(avon|powys|somerset|hampshire)')
print("3rd Result: ", regexp3.sub('', phrase))
3rd Result: 5 road bradford on dinas north
这错误地删除了每个单词,并完全忽略了'on\s' 或'dinas\s'。
然后我尝试了:
regexp4 = re.compile(r'(?<!on\s|dinas\s)(avon|powys|somerset|hampshire)')
print("4th Result: ", regexp4.sub('', phrase))
得到:
error: look-behind requires fixed-width pattern
我想结束:
Result: '5 road bradford on avon dinas powys north '
我看过了:
Why is this not a fixed width pattern? Python Regex Engine - "look-behind requires fixed-width pattern" Error regex: string with optional parts
但无济于事。
我做错了什么?
来自 cmets:
regexp5 = re.compile(r'(?<!on\s)(?<!dinas\s)(avon|powys|somerset|hampshire)')
print("5th Result: ", regexp5.sub('', phrase))
5th Result: 5 road bradford on avon avon dinas powys north
这又错过了第二个雅芳。
【问题讨论】:
-
将
(?<!on\s|dinas\s)替换为(?<!on\s)(?<!dinas\s) -
@WiktorStribiżew 忽略第二个 '
avon'->5th result = "5 road bradford on avon avon dinas powys north " -
然后使用单词边界 -
r'(?<!\bon\s)(?<!\bdinas\s)' -
@WiktorStribiżew 这给了我原来的错误
error: look-behind requires fixed-width pattern。 (见第 6 个正则表达式) -
见ideone.com/BSEojT。没有错误,结果符合预期。
标签: python regex python-3.x