猿问

如何返回与特定模式不匹配的字符串列表?

我试图从文本文件中返回与特定模式不匹配的所有结果,但我在语法上遇到了困难。


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


第三根弦是我想拉的


慕尼黑5688855
浏览 189回答 3
3回答

一只甜甜圈

如果您可以在 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.

翻阅古今

您可以检查您的正则表达式是否不是数学运算:if regex.match(text1) is None:     # Do magic you need

30秒到达战场

我建议在您的模式中使用否定前瞻断言: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_+\.-]+)')
随时随地看视频慕课网APP

相关分类

Python
我要回答