我有以下几行:
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,那么I数字就可以得到匹配。这意味着,从前面的行中只能获得153/G6S.3-H;2-3;1-2作为匹配,因为在其他行中,要么包含FO、SH、GDP,要么在开头只有一个数字。
我试着用
^[1-9][1-9]((?!FO|SH|GDP).)*$我得到了正确的结果,但我不确定是正确的,我不是很擅长正则表达式。
发布于 2019-04-19 11:31:16
您需要在起始数字和要排除的内容之间添加任何其他字符:
简化正则表达式:^[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-2https://stackoverflow.com/questions/55760932
复制相似问题