python - 我的负前瞻不起作用 - 为什么?
问题描述
我有一个散布着各种字符串、日期、制表符和语言代码的文本。我想提取日期+制表符组合之后的字符串,然后是像'[en]'这样的语言代码,一个制表符,之后我们没有字符串“BAD THINGS”(例如“ 2020-01-12\tSTRING WE NEED[en]\tGOOD THINGS",而不是"2020-01-12\tSTRING WE DON'T NEED[en]\tBAD THINGS")。
这是我正在使用的简短示例文本:
\n2021-01-12\t不需要这个字符串 [it]\tBad things\tBad things\n2021-01-12\t这个字符串也不需要 [en]\tBad things\tBad things\n2021-01-11\ tString 1 是必需的![it]\tString 1 是必需的!此处重复\t此处不感兴趣\n2021-01-11\t需要的String 2 [fr]\t此处重复需要的String 2\t不必要的字符串\n2021-01-11\t需要的String 3... [ ru]\tString 3 that is required...在这里重复\t我们不感兴趣的另一部分
我制作了这个正则表达式来捕获日期和语言代码之间的所有字符串:
(\d{4}-\d{2}-\d{2}\\t)(.*?)(\[\w{2}\]\\t)
这很好用(见这里)。但是,当我添加一个否定的前瞻来排除那些后面跟着“坏事”的人时,我所有的正则表达式都会向南:
(\d{4}-\d{2}-\d{2}\\t)(.*?)(\[\w{2}\]\\t)(?!Bad things)
你可以在这里看到结果。我知道我的前瞻不知何故使正则表达式变得贪婪,但我不知道如何避免这种情况,添加 ? 在它不起作用之后。你能帮帮我吗?
解决方案
不确定这是否会涵盖所有情况,但这似乎可行:
(\d{4}-\d{2}-\d{2}\\t)([^][]*)(\[\w{2}\]\\t)(?!Bad things)
演示在这里。
解释:
(\d{4}-\d{2}-\d{2}\\t) date and tab
([^][]*) collect only things that do not contain chars `[` and `]`
(\[\w{2}\]\\t) follow up [<tag>]
(?!Bad things) Negative Lookahead
推荐阅读
- sql - 将 varchar 值“x”转换为数据类型 int 时转换失败
- azure - Azure 密钥保管库。如何设置哪个 Web 应用程序使用哪个密钥库?
- mongodb - 如何准备正确的mongodb模式
- python - 我的第二个 for 循环不适用于在列表中查找素数。我该如何解决这个问题?
- javascript - 使用动态变量检索模型的属性值
- c# - 适用于 .NET 的 Oracle 数据提供程序不支持 Oracle 19.0.48.0.0
- python - 安装 psycopg2 失败的 python 3.7
- amazon-web-services - AWS ec2 通过不同的主机名/域名访问本地应用程序,无需 Route 53
- python - 检查两个对象是否可以相互比较,而不依赖于引发的错误
- rabbitmq - 我们如何在 saga 中使用 contextfilter 根据某些条件过滤命令/事件(消息)?