python - 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'
解决方案
从技术上讲,您不需要正则表达式(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)