我有以下几行:
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
如果在行首找到两个或三个数字但没有一个,我会用数字来获得匹配项,如果该字段在某处包含表达式FO
、SH
、GDP
或LDP
我不应该将其计为出现。这意味着,从前面的行来看,只得到153/G6S.3-H;2-3;1-2
作为匹配项,因为在其他行中要么包含FO
、SH
、GDP
,要么开头只有一个数字。
我试过使用
^[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