Замените символы escape-последовательности в строке в Python 3.x - PullRequest
2 голосов
/ 22 апреля 2019

Я использовал следующий код для замены экранированных символов в строке. Сначала я сделал разбиение по \n и использованному re.sub(), но все же я не знаю, что мне не хватает, код не работает в соответствии с ожиданиями. Я новичок в Python, поэтому, пожалуйста, не судите, есть ли проблемы с оптимизацией. Вот мой код :

#import sys
import re

String = "1\r\r\t\r\n2\r\r\n3\r\r\r\r\n\r\n\r4\n\r"
splitString = String.split('\n')
replacedStrings = []
i=0

for oneString in splitString:
    #oneString = oneString.replace(r'^(.?)*(\\[^n])+(.?)*$', "")
    oneString = re.sub(r'^(.?)*(\\[^n])+(.?)*$', "", oneString)
    print(oneString)
    replacedStrings.insert(i, oneString)

    i += 1

print(replacedStrings)

Моя цель здесь: Мне нужны только значения (без экранированных последовательностей) в качестве разделенных строк.

Мой подход здесь:

  1. Я разделил строку на \n, что дает мне список массивов отдельных строк.
  2. Затем я проверил каждую строку с помощью регулярного выражения, если регулярное выражение совпадает, то соответствующая подстрока заменяется на "".
  3. Затем я отправил эти строки в коллекцию, думая, что они будут хранить замененные строки в новом списке массивов.

Так что в основном я справился с 1 и 2, но в настоящее время я застрял на 3. Вот мой вывод:

1
2
3

4

['1\r\r\t\r', '2\r\r', '3\r\r\r\r', '\r', '\r4', '\r']

Ответы [ 3 ]

3 голосов
/ 22 апреля 2019

Возможно, вам будет проще использовать re.findall здесь с простым шаблоном \S+:

input = "1\r\r\t\r\n2\r\r\n3\r\r\r\r\n\r\n\r4\n\r"
output = re.findall(r'\S+', input)
print(output)

['1', '2', '3', '4']

Этот подход позволит изолировать и сопоставить любые острова одного или нескольких непробельных символов.

Редактировать:

На основе ваших новых входных данных мы можем попробовать сопоставить по шаблону [^\r\n\t]+:

input = "jkahdjkah \r\r\t\r\nA: B\r\r\nA : B\r\r\r\r\n\r\n\r4\n\r"
output = re.findall(r'[^\r\n\t]+', input)
print(output)

['jkahdjkah ', 'A: B', 'A : B', '4']

re.sub недействительно правильный инструмент для работы здесь.То, что будет на столе, будет split или re.findall, потому что вы хотите многократно сопоставлять / изолировать определенную часть вашего текста.re.sub полезен для взятия строки и преобразования ее во что-то другое.Он может использоваться для извлечения текста, но не очень хорошо работает для нескольких совпадений.

2 голосов
/ 22 апреля 2019

Вы были почти там, я бы просто использовал string.strip() для замены нескольких \r и \n в начале и конце строк

String = "1\r\r\t\r\n2\r\r\n3\r\r\r\r\n\r\n\r4\n\r"
splitString = String.split('\n')
replacedStrings = []
i=0

for oneString in splitString:
    s = oneString.strip()
    if s != '':
        print(s)
        replacedStrings.append(s)

print(replacedStrings)

Вывод будет выглядеть как

1
2
3
4
['1', '2', '3', '4']

Для "jkahdjkah \r\r\t\r\nA: B\r\r\nA : B\r\r\r\r\n\r\n\r4\n\r" вывод будет ['jkahdjkah', 'A: B', 'A : B', '4']

0 голосов
/ 22 апреля 2019

Я нашел еще один метод, он, кажется, работает нормально, он может быть не так оптимизирован, как другие ответы, но это просто другой способ:

import re
splitString = []
String = "jhgdf\r\r\t\r\nA  : B\r\r\nA  : B\r\r\r\r\n\r\n\rA: B\n\r"
splitString = re.compile('[\r\t\n]+').split(String)
if "" in splitString:
  splitString.remove("")
print(splitString)

Я добавил это здесь, чтобы люди, испытывающие те же проблемы, что и я, тоже могли пропустить этот подход.

Ниже приведен вывод, который я получил после использования приведенного выше кода:

['jhgdf', 'A  : B', 'A  : B', 'A: B']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...