匹配以两位或三位数字开头但在某处不包含特定模式的出现

时间:2019-04-19 11:09:45

标签: python regex

我有以下几行:

 12(3)/FO.2-3;1-2
 153/G6S.3-H;2-3;1-2
 1/G13S.2-3
 22/FO.2-3;1-2
 12(3)2S/FO.2-3;1-2
 153/SH/G6S.3-H;2-3;1-2
 45/3/H/GDP6;2-3;1-2

如果在行的开头找到两个或三个数字而不是一个,并且该字段在某些地方包含表达式FOSH,{{1} }或GDP,我不应该将其视为事件。这意味着,在前几行中,只会得到LDP作为匹配项,因为在其他行中要么包含153/G6S.3-H;2-3;1-2FOSH,要么在行中只有一位开始。

我尝试使用

GDP

我得到正确的结果,但是我不确定是正确的,我对正则表达式不是很熟练。

1 个答案:

答案 0 :(得分:2)

您需要添加可能在您的起始数字和您要排除的东西之间的其他任何字符:

简化的正则表达式:^[1-9]{2,3}(?!.*(?:FO|SH|GDP|LDP)).*$

将只匹配给定数据中的153/G6S.3-H;2-3;1-2

说明:

^[1-9]{2,3}(?!.*(?:FO|SH|GDP|LDP)).*$
-----------  2 to 3 digits or more at start of line  

^[1-9]{2,3}(?!.*(?:FO|SH|GDP|LDP)).*$
            --------------------- any characters + not matching (FO|SH|GDP|LDP)  

^[1-9]{2,3}(?!.*(?:FO|SH|GDP|LDP)).*$
                                  ---  match till end of line

(?:....)后面的否定后视必须完全遵循,在您不希望看到的内容和您的匹配项之间还有其他字符,因此不会被提取。

有关更多说明,请参见https://regex101.com/r/j4SRoQ/1(使用{2,})。


完整代码示例:

import re

regex = r"^[1-9]{2,3}(?!.*(?:FO|SH|GDP|LDP)).*$"

test_str = r"""12(3)/FO.2-3;1-2
153/G6S.3-H;2-3;1-2
1/G13S.2-3
22/FO.2-3;1-2
12(3)2S/FO.2-3;1-2
153/SH/G6S.3-H;2-3;1-2
45/3/H/GDP6;2-3;1-2"""

matches = re.finditer(regex, test_str, re.MULTILINE)

for match in matches: 
    print(match.group()) 

输出:

153/G6S.3-H;2-3;1-2