почему это python регулярное выражение терпит неудачу - PullRequest
1 голос
/ 30 апреля 2020
import sys
import os
import re
import numpy as np
#Tags to remove, sample line:  1:one:2:two:....:122:twentytwo:....:194:ninetyfour:....
r122 = re.compile(':122:(.):')
r194  = re.compile(':194:(.):')

if len(sys.argv) < 2 :
    sys.exit('Usage: python %s <file2filter>' % sys.argv[0])
if not os.path.exists(sys.argv[1]):
    sys.exit('ERROR: file %s not found!' % sys.argv[1])
with open (sys.argv[1]) as f:
    for line in f:
        line = re.sub(r':122:(.):', '', str(line))
        line = re.sub(r':194:(.):', '', str(line))
        print(line,end=" ")

In

1:one:2:two:....:122:twentytwo:....:194:ninetyfour:....

Out

1:one:2:two:....:122:twentytwo:....:194:ninetyfour:....

теги 122 и 194 не удаляются. что мне здесь не хватает?

1 Ответ

1 голос
/ 30 апреля 2020

Ваши шаблоны содержат (.), который соответствует и захватывает любой отдельный символ, кроме символа разрыва строки. Вам нужно сопоставить любые символы, кроме :, поэтому вам нужно использовать [^:]+.

Вам не нужно компилировать отдельные объекты регулярных выражений, если изменяется только часть вашего регулярного выражения. Вы можете создавать свои регулярные выражения динамически и компилировать один раз перед чтением файла. Например, у вас есть значения 122, 194 и 945 для использования в шаблоне :...:[^:]+: вместо ..., тогда вы можете использовать

vals = ["122", "194", "945"]
r = re.compile(r':(?:{}):[^:]+:'.format("|".join(vals)))
# Or, using f-strings
# r = re.compile(rf':(?:{"|".join(vals)}):[^:]+:')

Регулярное выражение будет выглядеть следующим образом :(?:122|194|945):[^:]+::

  • : - двоеточие
  • (?:122|194|945) - группа без захвата соответствие 122, 194 или 945
  • : - двоеточие
  • [^:]+ - 1+ символов, отличных от :
  • : - двоеточие

Затем используйте

with open (sys.argv[1], 'r') as f: 
    for line in f:
        print(r.sub('', line))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...