匹配以两位或三位数字开头但不包含特定模式的实例



我有以下几行:

 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

如果在行首找到两个或三个数字但没有一个,我会用数字来获得匹配项,如果该字段在某处包含表达式FOSHGDPLDP我不应该将其计为出现。这意味着,从前面的行来看,只得到153/G6S.3-H;2-3;1-2作为匹配项,因为在其他行中要么包含FOSHGDP,要么开头只有一个数字。

我试过使用

^[1-9][1-9]((?!FO|SH|GDP).)*$

我得到了正确的结果,但我不确定是否正确,我在正则表达式方面不是很专业。

您需要添加可能位于起始数字和要排除的内容之间的任何其他字符:

简化正则表达式:^[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

最新更新