我试图从文本文件中返回所有与特定模式不匹配的结果,但是语法上有困难。
pattern is [A-Z]+\_[A-Z0-9]+\_[0-9]+\_[0-9]+\.[A-Z]{3}
尝试以下操作没有成功:
'^(?![A-Z]+\_[A-Z0-9]+\_[0-9]+\_[0-9]+\.[A-Z]{3}$).*$'
r'^(?!([A-Z]+\_[A-Z0-9]+\_[0-9]+\_[0-9]+\.[A-Z]{3}).)*$'
下面是匹配模式的代码,现在我需要查找所有不匹配的条目。
pattern = r'[A-Z]+\_[A-Z0-9]+\_[0-9]+\_[0-9]+\.[A-Z]{3}'
regex1 = re.compile(pattern, flags = re.IGNORECASE)
regex1.findall(text1)
数据示例如下:
plos_annotate5_1375_1.txt plos_annotate5_1375_2.txt plos_anno%tate5_1375_3.txt plos_annotate6_1032_1.txt
第三个字符串是我想拉的
答案 0 :(得分:2)
如果可以在Python中进行运算,为什么要在正则表达式中取反?
strings_without_rx = [s for s in the_strings if not regex1.search(s)]
如果您要扫描文件行,甚至不需要全部存储它们,因为打开的文件是其行的可迭代项:
with open("some.file") as source:
lines_without_rx = [s for s in source if not regex1.search(s)]
# Here the file is auto-closed.
答案 1 :(得分:0)
您可以检查您的正则表达式是否在计算数学:
if regex.match(text1) is None:
# Do magic you need
答案 2 :(得分:0)
我建议对您的模式使用否定超前断言:
r'(?![A-Z]+\_[A-Z0-9]+\_[0-9]+\_[0-9]+\.[A-Z]{3}[^A-Za-z0-9_+\.-]+)'
如果没有与findall
配合使用,它将没有匹配的所有模式:
re.findall(r'(?![A-Z]+\_[A-Z0-9]+\_[0-9]+\_[0-9]+\.[A-Z]{3}[^A-Za-z0-9_+\.-]+)')