Python-正则表达式,以避免匹配重复项

时间:2018-09-20 05:38:17

标签: python regex

我的字符串如下:

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'

2 个答案:

答案 0 :(得分:1)

从技术上讲,您不需要正则表达式(例如,可以使用=IF(MOD(MONTH(H2)-1,$F$5)=0,$G$5,0)

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

regex101 demo

答案 1 :(得分:0)

使用

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

由于要包含bo_10,因此在初始组中应该使用\d+,而不仅仅是\d。然后,在否定的范围内,将反引号放在行首锚和行尾锚之间,例如,bo_1不会被排除,因为它后面跟着bo_10

https://regex101.com/r/8khbcc/1