首页 > 解决方案 > Python - 正则表达式以避免匹配重复项

问题描述

我的字符串如下所示:

bo_1
bo_1
bo_2
bo_2
bo_3
bo_3
bo_4
bo_4
bo_5
bo_5
bo_6
bo_6
bo_7
bo_7
bo_8
bo_8
bo_9
bo_9
bo_10
bo_10

我想匹配每个数字的第一个实例并忽略下一个重复行。我的正则表达式如下:

(bo_\d)(?![\s\S]*\1)

它返回以下内容:

'bo_2'
'bo_3'
'bo_4'
'bo_5'
'bo_6'
'bo_7'
'bo_8'
'bo_9'
'bo_1'

我将如何修改正则表达式以返回这样的结果(在开头包含“bo_1”,在结尾包含“bo_10”):

'bo_1'
'bo_2'
'bo_3'
'bo_4'
'bo_5'
'bo_6'
'bo_7'
'bo_8'
'bo_9'
'bo_10'

标签: pythonregex

解决方案


从技术上讲,您不需要正则表达式(set()例如,您可以使用):

>>> # Assume your string is in the variable called "text"
>>> result = set(text.split('\n'))
>>> result
{'bo_7', 'bo_3', 'bo_1', 'bo_6', 'bo_5', 'bo_8', 'bo_9', 'bo_2', 'bo_4', 'bo_10'}

无论如何,您的正则表达式的问题bo_1也是匹配bo_10,因此正则表达式会将其视为重复项。您可以使用单词边界来解决它,以确保测试完整的“单词”是否匹配:

\b(bo_\d+)\b(?![\s\S]*\b\1\b)

正则表达式101演示


推荐阅读