Страницы

Поиск по вопросам

Показаны сообщения с ярлыком split. Показать все сообщения
Показаны сообщения с ярлыком split. Показать все сообщения

понедельник, 24 февраля 2020 г.

Python, разделение строки по символам через метод re.split

#python #python_3x #строки #split


Необходимо разделить входящую строку по числам и буквам, например:

s = "k10Z18i13Q19u"
a = re.split("(\d*)", s)


На выходе получим:

['k', '10', 'Z', '18', 'i', '13', 'Q', '19', 'u']


Но так же получим ошибку:

FutureWarning: split() requires a non-empty pattern match.
  return _compile(pattern, flags).split(string, maxsplit)


Данный метод очень подходит для решения моей задачи, но не пойму, отчего ошибки.
Именно шаблон для разделения строки (\d*) взял из чужого решения, но не знаю как именно
он работает, не смог найти описания.
Можете подсказать, что делаю не так или каким методом лучше решить данную задачу?
    


Ответы

Ответ 1



Замените (\d*) на (\d+) Поясню что не так: (\d*) подразумевает ноль или более цифр. То есть пустым разделитель тоже может быть. Если это учитывать, то ваш результат мог быть и таким: ['', 'k', '10', 'Z', '18', 'i', '13', 'Q', '19', 'u', ''] Также если бы у вас были две буквы подряд, то между ними тоже могла бы "найтись" пустая строка. Текущая реализация этого метода не находит пустые подстроки, которые могут подходить под регулярное выражение. Однако в будущем планируется это реализовать, поэтому вы получаете FutureWarning. Вас предупреждают, что если вы ничего не измените, после обновления вас может ожидать сюрприз. См. также re.split

понедельник, 3 февраля 2020 г.

Java. String.split(Regex) Парсинг строки

#java #регулярные_выражения #split


Дается строка, которую нужно распарсить на составные части

String line = "param1 param2 'param3 param3 param3' param4";
String[] params = line.split("Регулярное выражение");


На выходе params должен разбиваться по пробелу и по 'тексту в кавычках':
То есть:

param1
param2
param3 param3 param3
param4


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

String[] params = line.split("[\\s(^'.'$)]");

    


Ответы

Ответ 1



Еще вариант: String line = "param1 param2 'param3 param3 param3' param4"; System.out.println(Arrays.asList(line.replaceAll("\'", "").split("'?(\\s|$)(?=(([^']*'){2})*[^']*$)'?"))); // [param1, param2, param3 param3 param3, param4] С использованием apache-commons-lang StrTokenizer tokenizer = new StrTokenizer(line, ' ', '\''); while(tokenizer.hasNext()) { System.out.println(tokenizer.nextToken()); } // param1 // param2 // param3 param3 param3 // param4 Последний вариант (честно стырено отсюда): ArrayList list = new ArrayList(); Matcher m = Pattern.compile("((?<=')[^']*(?='(\\s|$)+)|(?<=\\s|^)[^\\s']*(?=\\s|$))").matcher(line); while ( m.find() ) { list.add(m.group(1)); } System.out.println(list); // [param1, param2, param3 param3 param3, param4]

Ответ 2



Попробуйте такой код: String line = "param1 param2 'param3 param3 param3' param4"; ArrayList list = new ArrayList(); Matcher m = Pattern.compile("([^\']\\S*|\'.+?\')\\s*").matcher(line); while (m.find()) list.add(m.group(1).replaceAll("'", "")); System.out.println(list); В итоге получится: [param1, param2, param3 param3 param3, param4] Смотрим группу без кавычек [^\']\\S* или группу с кавычками \'.+?\'.

понедельник, 6 января 2020 г.

Как разбить строку по запятой, кроме случая когда за ней следует пробел?

#java #split


Есть строка 1,2,3,"4, A",B, 5,C,6,7,8. Подскажите пожалуйста, как ее разбить на подстроки
по запятой но пропустив запятую + пробел? Ниже код который работает, может есть более
простой вариант?

String s = "1,2,3,\"4, A\",B, 5,C,6,7,8";
String[] ss;
s = s.replaceAll(", ", "#%&"); // меняем "запятая + пробел" на любой символ
ss = s.split(",");
for (int i = 0; i < ss.length; i++) {
    System.out.println(ss[i].replaceAll("#%&", ", ")); // возвращаем запятую с пробелом
обратно
}

    


Ответы

Ответ 1



Т.к. split принимает регулярное выражение, то можно использовать просмотр вперед с отрицанием: String[] ss = s.split(",(?!\\s)"); Выражение ,(?!\s) означает: «запятая, если за ней не следует пробельный символ». Пробельный символ может быть любой, если нужно игнорировать именно пробел, то укажите его явно: String[] ss = s.split(",(?! )");

Ответ 2



String s = "1,2,3,\"4, A\",B, 5,C,6,7,8"; StringTokenizer st = new StringTokenizer(s, ","); while(st.hasMoreTokens()){ String nextToken = st.nextToken(); if (!nextToken.equals(nextToken.trim())) System.out.print(","); else System.out.println(""); System.out.print(nextToken); }

суббота, 28 декабря 2019 г.

Помощь с Split С#

#c_sharp #split


У меня есть длинная строка, в которой есть переходы на новую строку, вопросительные,
восклицательные знаки, точки.
Мне нужно получить массив строк, которые будут делиться по правилу, 

String[] lines = myText.Split(new char[] { '\r', '\n', '.', '!', '?' }, StringSplitOptions.RemoveEmptyEntries);


Такое решение делит всё верно, но проблема в том, что оно удаляет знаки препинания.
Я хотел бы оставлять '.', '!', '?' вот эти знаки и удалять переходы на новую строку \r, \n.
Пример: 

Lorem ipsum, dolor sit amet, elit. Nullam! Faucibus congue?
Phasellus molestie, orci
Ut aliquam nulla tristique nec?
Nec bibendum tortor sodales!


Результат

1-Lorem ipsum, dolor sit amet, elit.
2-Nullam!
3-Faucibus congue?
4-Phasellus molestie, orci
5-Ut aliquam nulla tristique nec?
6-Nec bibendum tortor sodales!


Всем большое спасибо! Все ответы рабочие:)
    


Ответы

Ответ 1



Сначала подготавливаем текст, добавляя в знаки !?. \n. var prepair = myText.Replace(".",".\n").Replace("!","!\n").Replace("?","?\n"); String[] lines = prepair.Split(new char[] { '\r', '\n' }, StringSplitOptions.RemoveEmptyEntries);

Ответ 2



Давайте разделим текст с помощью регулярки: string text = "Lorem ipsum, dolor sit amet, elit. Nullam! Faucibus congue?\r\nPhasellus molestie, orci\r\nUt aliquam nulla tristique nec?\r\nNec bibendum tortor sodales!"; string pattern = @"((?<=[.?!])|\r?\n) *"; foreach (string s in Regex.Split(text, pattern).Where(s => !string.IsNullOrWhiteSpace(s))) Console.WriteLine(s); Правда, придется удалить пустые строки вручную (я делаю это с помощью Where), так как в Regex.Split() нету аналога StringSplitOptions.RemoveEmptyEntries Здесь паттерн описывает формат разделителя: (?<=[.?!]) - положительный просмотр назад, т.е. ищем один из символов . или ? или !, но они сами в разделитель не входят, они войдут в часть перед разделителем \r?\n - перевод строки, поддерживает варианты как \r\n, так и просто \n | - "или", т.е. разделитель удовлетворяет или одному шаблону, или другому * - и любое число пробелов, они будут принадлежать разделителю и в результат не попадут

вторник, 7 мая 2019 г.

Python, разделение строки по символам через метод re.split

Необходимо разделить входящую строку по числам и буквам, например:
s = "k10Z18i13Q19u" a = re.split("(\d*)", s)
На выходе получим:
['k', '10', 'Z', '18', 'i', '13', 'Q', '19', 'u']
Но так же получим ошибку:
FutureWarning: split() requires a non-empty pattern match. return _compile(pattern, flags).split(string, maxsplit)
Данный метод очень подходит для решения моей задачи, но не пойму, отчего ошибки. Именно шаблон для разделения строки (\d*) взял из чужого решения, но не знаю как именно он работает, не смог найти описания. Можете подсказать, что делаю не так или каким методом лучше решить данную задачу?


Ответ

Замените (\d*) на (\d+)
Поясню что не так: (\d*) подразумевает ноль или более цифр. То есть пустым разделитель тоже может быть. Если это учитывать, то ваш результат мог быть и таким:
['', 'k', '10', 'Z', '18', 'i', '13', 'Q', '19', 'u', '']
Также если бы у вас были две буквы подряд, то между ними тоже могла бы "найтись" пустая строка. Текущая реализация этого метода не находит пустые подстроки, которые могут подходить под регулярное выражение. Однако в будущем планируется это реализовать, поэтому вы получаете FutureWarning. Вас предупреждают, что если вы ничего не измените, после обновления вас может ожидать сюрприз.
См. также re.split

воскресенье, 7 апреля 2019 г.

Java. String.split(Regex) Парсинг строки

Дается строка, которую нужно распарсить на составные части
String line = "param1 param2 'param3 param3 param3' param4"; String[] params = line.split("Регулярное выражение");
На выходе params должен разбиваться по пробелу и по 'тексту в кавычках': То есть:
param1 param2 param3 param3 param3 param4
Я не могу составить подобное регулярное выражение, прошу помочь. Вот мой вариант, но он не работает так как нужно:
String[] params = line.split("[\\s(^'.'$)]");


Ответ

Еще вариант:
String line = "param1 param2 'param3 param3 param3' param4"; System.out.println(Arrays.asList(line.replaceAll("\'", "").split("'?(\\s|$)(?=(([^']*'){2})*[^']*$)'?"))); // [param1, param2, param3 param3 param3, param4]
С использованием apache-commons-lang
StrTokenizer tokenizer = new StrTokenizer(line, ' ', '\''); while(tokenizer.hasNext()) { System.out.println(tokenizer.nextToken()); } // param1 // param2 // param3 param3 param3 // param4
Последний вариант (честно стырено отсюда):
ArrayList list = new ArrayList(); Matcher m = Pattern.compile("((?<=')[^']*(?='(\\s|$)+)|(?<=\\s|^)[^\\s']*(?=\\s|$))").matcher(line); while ( m.find() ) { list.add(m.group(1)); } System.out.println(list); // [param1, param2, param3 param3 param3, param4]