2015-07-27 2 views
2

У меня проблема. То, что я пытаюсь сделать, это сортировать данные и создавать новые строки в определенных точках. В настоящее время мой код выглядит следующим образом:Python Regex Remove n

from __future__ import print_function 
import re 
NDoc = raw_input("Enter name of new document ")+".txt" 
log = open(NDoc, 'w') 
file = raw_input("Enter a file to be sorted ") 
extfile = file+".txt" 
xfile = open(file+".txt") 

for line in xfile: 
    l=line.strip() 
    l=re.sub("\n","",l) 
    n=re.sub("(\B)(?=((MTH|HST|ENG)[|]))","\n",line) 

    if len(n) > 0: 
     nl=n.split("\n") 
     for item in nl: 
       log.write(item+"\n") 
        #print(item) 

print ("The data from",extfile,"has been sorted into",NDoc) 

Все работает нормально за исключением того, что после третьего срока (ENG |) новая строка появляется в моих данных. Например, если мой файл данных было так:

MTH|lettersandnumbersHST|lettersandnumbersENG|lettersandnumbers 
MTH|lettersandnumbersHST|lettersandnumbersENG|lettersandnumbers 
MTH|lettersandnumbersHST| 

Я ожидал бы выглядеть следующим образом:

MTH|lettersandnumbers 
HST|lettersandnumbers 
ENG|lettersandnumbers 
MTH|lettersandnumbers 
HST|lettersandnumbers 
ENG|lettersandnumbers 
MTH|lettersandnumbers 
HST| 

Но вместо этого дает мне это:

MTH|lettersandnumbers 
HST|lettersandnumbers 
ENG|lettersandnumbers 

MTH|lettersandnumbers 
HST|lettersandnumbers 
ENG|lettersandnumbers 

MTH|lettersandnumbers 
HST| 

Теперь я думал, что l=re.sub("\n","",l) заменит все \ n на ничего, пока не будут добавлены новые \ n, поэтому почему еще есть дополнительная строка, но только после ENG?

Благодарим вас за любые сведения.

+0

'л = l.replace ("\ п", "")' – heinst

+0

Я заметил, что вы присвоить ссылку 'L', а затем никогда не использовать его снова. Возможно, это должно быть «строка»? – TigerhawkT3

ответ

1

Вы используете неправильное имя для своей линии.

l=line.strip() 
l=re.sub("\n","",l) 

должен быть

line=line.strip() 
line=re.sub("\n","",line) 

или просто

line=line.strip().replace('\n', '') 
+0

Да, это было все, спасибо, что поймал мою глупую ошибку. –

0

У вас есть пробелы в ваших исходных данных после того, как "ENG." Просто отбросьте их, и все будет хорошо.

l=re.sub(' ', '', l) 
+0

Вы проверили это? Потому что я не думаю, что это сработает. – TigerhawkT3

0

Вы можете использовать FindAll, чтобы соответствовать либо схеме:

s = """MTH|lettersandnumbersHST|lettersandnumbersENG|lettersandnumbers 
MTH|lettersandnumbersHST|lettersandnumbersENG|lettersandnumbers 
MTH|lettersandnumbersHST|""" 

r= re.compile("([A-Z]+\|[0-9a-z]+|[A-Z]+\|)",) 
for line in s.splitlines(True): 
    print("\n".join(r.findall(line))) 

Выход:

MTH|lettersandnumbers 
HST|lettersandnumbers 
ENG|lettersandnumbers 
MTH|lettersandnumbers 
HST|lettersandnumbers 
ENG|lettersandnumbers 
MTH|lettersandnumbers 
HST| 
1

Я думаю, что вы не используете правильный инструмент.

Вы, вероятно, хотите re.sub:

print(re.sub("([^\n])(MTH|HST|ENG)", r"\1\n\2", st)) 

Краткое объяснение: Это захватывает любой из вариантов MTH, HST или ENG, не \n перед ним ([^\n] это «ничего, кроме \n»), а также характер и прежде, и добавляет между ними \n. Результат - то, что вы ожидаете.

Пример:

>>> st = """MTH|lettersandnumbersHST|lettersandnumbersENG|lettersandnumbers 
... MTH|lettersandnumbersHST|lettersandnumbersENG|lettersandnumbers 
... MTH|lettersandnumbersHST|""" 
>>> print(re.sub("([^\n])(MTH|HST|ENG)", r"\1\n\2", st)) 
MTH|lettersandnumbers 
HST|lettersandnumbers 
ENG|lettersandnumbers 
MTH|lettersandnumbers 
HST|lettersandnumbers 
ENG|lettersandnumbers 
MTH|lettersandnumbers 
HST| 
+0

Это полезно знать, спасибо! –