改进regex搜索模式

2024-09-30 04:39:40 发布

您现在位置:Python中文网/ 问答频道 /正文

假设我有一个这样的文件:

'''
MFTF2LH_LSetC1_D-10_hot50_fa00_bpmax
MFTF2LH_LSetC1_D-11_hot50_fa00_bpmax
MFTF2LH_LSetC1_D-01_hot56_fa00_bpmax
MFTF2LH_LSetC1_D-02_hot56_fa00_bpmax
MFTF2LH_LSetC1_D-03_hot56_fa00_bpmax
MFTF2LH_LSetC1_D-04_hot50_fa00_bpmax
MFTF2LH_LSetC1_D-07_hot43_fa00_bpmax
MFTF2LH_LSetC1_D-10_hot56_fa00_bpmax
'''

但却有数百万或几排

我想做的是逐行阅读,忽略以下内容:

  • _D-XX\u hotYY在[01,07]中包含XX,且YY=4350
  • _D-XX\u hot56与[08,11]中的XX一起

因此,对于上面的示例行,只有最后三行将被忽略

我正在使用这个regex模式来实现这个技巧(test here):

pattern = '(_D-0[1-7]_hot(43|50)|_D-0[8,9]_hot56|_D-1[0,1]_hot56)'

但我想知道是否有更好的方法,因为我只想返回一个布尔值;没有任何团体或任何东西

顺便说一句,我完全是个初学者


Tags: 文件示例模式regexxx行将yyhot50
2条回答

我将grep-v(还原匹配项)一起使用:

grep -Ev "D-[0][1-7]_hot(?:43|50)|D-(?:08|09|10|11)_hot56" raw.txt > filtered.txt

它完全匹配您不需要的内容,然后还原匹配项

您可以通过使备选方案仅在字符串中的不同位置匹配来改进您的模式

使用

rx = re.compile(r'_D-(?:1[01]_hot56|0(?:[89]_hot56|[1-7]_hot(?:43|50)))')
# .... Read the file line by line ...
if not rx.search(line):
    # Ok, process

参见regex demo

图案细节

  • _D--文字子串
  • (?:-非捕获组的开始(与捕获组不同,没有为组创建内存缓冲区)匹配:
    • 1[01]_hot56-1,然后01,然后_hot56
    • |-或
    • 0-a0字符,然后
    • (?:-第二个非捕获组
      • [89]_hot56-89然后_hot56
      • |
      • [1-7]_hot(?:43|50)—从17的数字,然后是_hot,然后是4350
    • )-第二个非捕获组的结尾
  • )-第一个非捕获组的结尾

相关问题 更多 >

    热门问题