【问题标题】:Regex: How to match the complement of a pattern [duplicate]正则表达式:如何匹配模式的补码
【发布时间】:2020-04-19 00:15:21
【问题描述】:

我从包含换行符(在本例中为 \N)和其他我不想保留的子字符串的文本文件中获取字符串。在换行符的情况下,我可以使用...

re.search('\\\\N', string)

要匹配它们,但我想知道如何匹配字符串的其余部分。正如我所说,我需要用其他子字符串来做。我试着做...

re.search('^\\\\N', string)

但这没有返回匹配项。我猜它实际上试图匹配一个以'\'开头的'N',而后者又以'\'以外的任何字符开头。

如何匹配与我传递的正则表达式不匹配的任何内容?

【问题讨论】:

  • Regex 允许您执行否定模式匹配(即在模式不存在时进行匹配)。但是,不清楚您不想匹配哪种模式。
  • @DarrylG 在许多文件之一中,我有字符串 'May 10th.感谢上帝的雨\N帮助冲走了。现在,我想匹配除 '\N' 之外的所有内容。它被读作'\\N',我不想匹配它。还有其他一些我不想匹配的模式,但我确定如果我知道如何使用这个最常见的模式,我会知道如何使用其他模式。
  • 也许你只是想要re.sub(r'\\N', '', string)
  • 在这种情况下,您可能想要使用 Nick 的建议或干脆 string replace
  • \N 不是换行符,换行符是\n。在 PCRE 中,\N 表示任何换行符,在 Python 中,它仅表示 N

标签: python regex python-re


【解决方案1】:

我假设您希望逐行进行此匹配。描述如何执行此操作的最佳方法是举个例子。假设我有以下文件,test.txt:

{'name': 'Bryan', 'age': 34, 'male': True, 'hometown': 'Boston'}
{'name': 'Anna', 'age': 25, 'male': False, 'hometown': 'Chicago'}
{'name': 'Jeff', 'age': 47, 'male': True, 'hometown': 'Vancouver'}
{'name': 'Maria', 'age': 58, 'male': False, 'hometown': 'Madrid'}

对于每一行我想匹配 不匹配的任何内容 匹配正则表达式:

r" 'age': \d+,"

所以对于第一行,那就是:

{'name': 'Bryan', 'male': True, 'hometown': 'Boston'}

本质上我们只是用一个空字符串替换正则表达式r" 'age': \d+,",所以:

import re

pattern = re.compile(r" 'age': \d+,")

with open('test.txt') as f:
    for line in f:
        line = pattern.sub(r'', line)
        print(line, end='')

打印:

{'name': 'Bryan', 'male': True, 'hometown': 'Boston'}
{'name': 'Anna', 'male': False, 'hometown': 'Chicago'}
{'name': 'Jeff', 'male': True, 'hometown': 'Vancouver'}
{'name': 'Maria', 'male': False, 'hometown': 'Madrid'}

总结

搜索您的正则表达式并将其替换为空字符串。剩下的就相当于匹配了所有正则表达式的补码。

【讨论】:

  • 我现在才看到@nick 在评论中建议了这种方法,现在正在争论我是否应该删除这个答案。但我决定离开它,因为“它不会受伤。”
  • 非常感谢。
猜你喜欢
  • 1970-01-01
  • 2013-06-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多