正则表达式过滤器开头包含单词,但不包含另一个单词

时间:2019-09-05 19:14:40

标签: python regex

假设我有以下字符串

GPH_EPL_GK_FIN

我想要一个正则表达式,该表达式必须在python中使用,以便从csv文件(与该问题无关)中查找此类字符串,以以GPH开头但DONT包含EPL的记录

我知道胡萝卜^用于开始搜索

所以我有这样的东西

^GPH_.*

我也想包含NOT包含部分,如何链接正则表达式? 即

(^GPH_.*)(?!EPL)

我最终希望进一步走下去,并返回没有EPL的所有记录,即

GPH_ABC_JKL_OPQ

GPH_部分EPL之后加入

即理想的结果

GPH_EPL_ABC_JKL_OPQ

4 个答案:

答案 0 :(得分:2)

要满足这两个要求:

  • 编写一个模式以匹配以GPH开头但不包含EPL
  • 的行
  • EPL_零件插入匹配线到特定位置

import re

# sample string containing lines
s = '''GPH_EPL_GK_FIN
GPH_ABC_JKL_OPQ'''

pat = re.compile(r'^(GPH_)(?!.*EPL.*)')
for line in s.splitlines():
    print(pat.sub('\\1EPL_', line))

输出:

GPH_EPL_GK_FIN
GPH_EPL_ABC_JKL_OPQ

答案 1 :(得分:1)

我认为这可以做到: ^GPH_(?!EPL).*

这将返回任何以GPH开头并且在EPL之后没有GPH_的字符串。

答案 2 :(得分:1)

我只是在猜测一种选择,

(?<=^GPH_(?!EPL))

re.sub

EPL_

测试

import re   

print(re.sub(r"(?<=^GPH_(?!EPL))", "EPL_", "GPH_ABC_JKL_OPQ"))

输出

GPH_EPL_ABC_JKL_OPQ

答案 3 :(得分:1)

只需使用此:

https://regex101.com/r/GwBsg2/2

  • 模式:^(?!^(?:[^_\n]+_)*EPL_?(?:[^_\n]+_?)*)(.*)GPH
  • 替代:\1GPH_EPL
  • 标志:gm