Python正则表达式匹配“约翰”,而不是“1约翰”,“2约翰”或“3约翰”

问题描述 投票:0回答:1

我看不到找到只能找到“John”的Python 3正则表达式模式,而不是“1 John”,“1Jn”,“2 John”,“2Jn”,“3 John”或“3Jn”。

例如在r“1 John,John John,3 John,John John,John。”,我只希望它与John的最后两次提及相匹配,而不是John的前三次提及。

我已经尝试了很多东西,并继续回到像r"(?<!\s[123I]\s)(?<!^[123I]\s)Jn|John"这样的Python 3正则表达式模式。但这抓住了约翰的所有5次提及,而不仅仅是最后两次。

有没有办法获得“约翰”,但不是“1约翰”,“1Jn”,“2约翰”,“2Jn”,“3约翰”或“3Jn”?

regex python-3.x
1个回答
1
投票

你不需要在后面的模式中使用^,它将匹配所有出现的John,只要它不会出现在字符串的开头由于负面背后;你需要对JnJohn进行分组,以便后面的外观适用于两者,因为(?<!^[123I]\s)Jn|John匹配(?<!^[123I]\s)JnJohn

s = "1 John, 2 John, 3 John, everywhere a John, John."
re.findall(r'(?<![123I] )(?:Jn|John)', s)
# ['John', 'John']
© www.soinside.com 2019 - 2024. All rights reserved.