Регулярка для чистки текста от мусора

one

Client
Регистрация
22.09.2015
Сообщения
6 831
Благодарностей
1 275
Баллы
113
Друзья, поделитесь кому не жалко решением для чистки спарсенного текста от всевозможного мусора. Буду весьма благодарен за оказанную помощь! Делаю шаблон для парсинга снипетов ПС.
 

one

Client
Регистрация
22.09.2015
Сообщения
6 831
Благодарностей
1 275
Баллы
113
Нету тут таких? кто занимается донного вида благотворительность? :-)
 

orka13

Client
Регистрация
07.05.2015
Сообщения
2 177
Благодарностей
2 183
Баллы
113
  • Спасибо
Реакции: one

one

Client
Регистрация
22.09.2015
Сообщения
6 831
Благодарностей
1 275
Баллы
113
Спасибо! Посмотрю. Можно будет с вопросам стукнуться в ЛС если будут?
 

orka13

Client
Регистрация
07.05.2015
Сообщения
2 177
Благодарностей
2 183
Баллы
113
ок. Вот еще код, я его вроде из того же шаблона брал именно под обработку сниппетов какой-то ПС. Но цифры в комментариях могут не совпадать с цифрами в коде, так как правил код, но комменты не обновлял уже:
C#:
//project.Variables["Snippets_List_To_STring_1"].Value = Snippets_List_To_STring;
// заменяем псевдо-пробелы (табы и т.д.) на обычный пробел:
string regexTest = System.Text.RegularExpressions.Regex.Replace(project.Variables["Snippets_List_To_STring_1"].Value, @"[^\r\n \S]", " ", System.Text.RegularExpressions.RegexOptions.Multiline);
// заменяем 2 пробельных знака на 1:
regexTest = System.Text.RegularExpressions.Regex.Replace(regexTest, @"[\ ]{2,}", " ", System.Text.RegularExpressions.RegexOptions.Multiline);
  
// разбиваем строки на многоточии
regexTest = System.Text.RegularExpressions.Regex.Replace(regexTest, @" *(\.\.\.|…) *", "\r\n", System.Text.RegularExpressions.RegexOptions.Multiline);

//regexTest = System.Text.RegularExpressions.Regex.Replace(regexTest, @"(?<=[^\!\.\?\r\n]{6,650}[\S]{1,})[\!\.\?]\ (?=[\w][^\.]{5,650})", ".\r\n", System.Text.RegularExpressions.RegexOptions.Multiline);
// умно разбиваем длинные строки на предложение по наличию точки, + пробела и заглавной буквы после нее, + текста без точки недалеко перед ней (правда большинство доргенов все равно потом любую точку в пределах предложения посчитают за конец предложения):
regexTest = System.Text.RegularExpressions.Regex.Replace(regexTest, @"(?<=[^\!\.\?\r\n]{9,650})(?<!Mr|Mrs|Miss|Ms|Dr|\W\w)[\!\.\?]\ (?=[A-Z][^\.\r\n]{8,650})", ".\r\n", System.Text.RegularExpressions.RegexOptions.Multiline|System.Text.RegularExpressions.RegexOptions.IgnoreCase );
// разбиваем строки с началом на Mr, Mrs, Miss, Ms, Dr (ошибочно недоразбитые в предыдущем шаге):
regexTest = System.Text.RegularExpressions.Regex.Replace(regexTest, @"(?<=[^\s])\.\ (?=Mr\.\ |Mrs\.\ |Miss\.\ |Ms\.\ |Dr\.\ )", ".\r\n", System.Text.RegularExpressions.RegexOptions.IgnoreCase );

// удаляем строки, где в конце нет знаков !?.:
regexTest = System.Text.RegularExpressions.Regex.Replace(regexTest, @"^.*[^\.\!\?](\r\n)", "", System.Text.RegularExpressions.RegexOptions.Multiline);
// удаляем строки, где мало символов, количество задается в настройках проекта, а регулярку я прописал в первых блоках (^.{0,60}\r\n):
regexTest = System.Text.RegularExpressions.Regex.Replace(regexTest, "^.{0,30}\r\n", "", System.Text.RegularExpressions.RegexOptions.Multiline);
// удаляем строки где есть какие-то экзотические (включая кириллицу) символы кроме перечисленных:
regexTest = System.Text.RegularExpressions.Regex.Replace(regexTest, @"^.*[^ \n\r\-\:\(\)\\—\.\,\%\”\“\’\;\!\?\'\""\$\&\#\w\–\+]+.*\r\n", "", System.Text.RegularExpressions.RegexOptions.Multiline);
// удаляем строки где есть ссылки(www. или http):
regexTest = System.Text.RegularExpressions.Regex.Replace(regexTest, @"^.*(www\.|http|\[URL=\S+).*(\r\n|$)", "");
regexTest = System.Text.RegularExpressions.Regex.Replace(regexTest, @"^.*\.(com|org|net|biz|info|de|ru|uk|tk)\W.*(\r\n|$)", "");
// удаляем строки (уже готовые предложения), где нет ни единой маленькой буквы:
regexTest = System.Text.RegularExpressions.Regex.Replace(regexTest, @"^[^a-zа-я]*\r\n", "\r\n", System.Text.RegularExpressions.RegexOptions.Multiline);
// удаляем строки, которые начинаются НЕ с заглавной буквы (лучше потом на С# по списку сделать):
//regexTest = System.Text.RegularExpressions.Regex.Replace(regexTest, @"^[^A-ZА-ЯЁ].+\r\n", "", System.Text.RegularExpressions.RegexOptions.Multiline);
// удаляем строки, где мало слов, количество задается в настройках проекта, а регулярку я прописал в первых блоках (^[^ \r\n$]*( +[^ \r\n$]*){0,4}\r\n):
regexTest = System.Text.RegularExpressions.Regex.Replace(regexTest, @"(^[^ \r\n$]*( +[^ \r\n$]*){0,3}\r\n)", "", System.Text.RegularExpressions.RegexOptions.Multiline);
// удаляем строки, где от 30 шт. не буквенно-циферных знаков (типа много мусора):
regexTest = System.Text.RegularExpressions.Regex.Replace(regexTest, @"^[\w ]*([^\w\r\n$ ][\w ]*){10,}\r\n", "", System.Text.RegularExpressions.RegexOptions.Multiline);
// удаляем строки, где подряд от 4 шт. не буквенно-циферных знаков (мусор):
regexTest = System.Text.RegularExpressions.Regex.Replace(regexTest, @"^[\w ]*([^\w\r\n$ ]{4,}[\w ]*)\r\n", "", System.Text.RegularExpressions.RegexOptions.Multiline);
// удаляем пустые строки:
regexTest = System.Text.RegularExpressions.Regex.Replace(regexTest, @"\n\r", "", System.Text.RegularExpressions.RegexOptions.Multiline);
// опять заменяем многоточие на 1 точку:
regexTest = System.Text.RegularExpressions.Regex.Replace(regexTest, @"(?<=[^\.])\.{2,}(?=[^\.])", ".", System.Text.RegularExpressions.RegexOptions.Multiline);
// удаляем лишние повторение знаков препинания в конце строки:
regexTest = System.Text.RegularExpressions.Regex.Replace(regexTest, @" ?([\.\!\?\:\,\:\;\ ]){2,}(?=\r\n|$)", ".", System.Text.RegularExpressions.RegexOptions.Multiline);
// удаляем перед знаками .,:; ненужные пробелы:
regexTest = System.Text.RegularExpressions.Regex.Replace(regexTest, @"\ (\.|\,|\:|\;)", "$1", System.Text.RegularExpressions.RegexOptions.Multiline);

// в финальный список берем только строки начинающиесе с заглавной буквы или цифры:
List <string> Snippets_2 = new List <string>();
var splitter = "\r\n";
foreach (string x in regexTest.Split(new String[] {splitter}, StringSplitOptions.RemoveEmptyEntries))
{
    if (char.IsUpper(x, 0) || char.IsDigit(x, 0))
    {
        Snippets_2.Add(x);
    }
}
 
  • Спасибо
Реакции: one

one

Client
Регистрация
22.09.2015
Сообщения
6 831
Благодарностей
1 275
Баллы
113
Благодарю сердечно!
 

orka13

Client
Регистрация
07.05.2015
Сообщения
2 177
Благодарностей
2 183
Баллы
113
В предыдущем примере я забыл уточнить что снипет заточен под шаблон с английскими ключами, и чтобы этот кусок кода сработал самостоятельно и вернул результат надо в конце добавить еще 2 строки. Да и сам код не особо оптимизирован, может для сильных нагрузок надо лучше в списке обработку делать, а не регулярками, я не сравнивал. вот вариант под En-Ru язык:
C#:
//project.Variables["Snippets_List_To_STring_1"].Value = Snippets_List_To_STring;
// заменяем псевдо-пробелы (табы и т.д.) на обычный пробел:
string regexTest = System.Text.RegularExpressions.Regex.Replace(project.Variables["Snippets_List_To_STring_1"].Value, @"[^\r\n \S]", " ", System.Text.RegularExpressions.RegexOptions.Multiline);
// заменяем 2 пробельных знака на 1:
regexTest = System.Text.RegularExpressions.Regex.Replace(regexTest, @"[\ ]{2,}", " ", System.Text.RegularExpressions.RegexOptions.Multiline);

// разбиваем строки на многоточии
regexTest = System.Text.RegularExpressions.Regex.Replace(regexTest, @" *(\.\.\.|…) *", "\r\n", System.Text.RegularExpressions.RegexOptions.Multiline);

//regexTest = System.Text.RegularExpressions.Regex.Replace(regexTest, @"(?<=[^\!\.\?\r\n]{6,650}[\S]{1,})[\!\.\?]\ (?=[\w][^\.]{5,650})", ".\r\n", System.Text.RegularExpressions.RegexOptions.Multiline);
// умно разбиваем длинные строки на предложение по наличию точки, + пробела и заглавной буквы после нее, + текста без точки недалеко перед ней (правда большинство доргенов все равно потом любую точку в пределах предложения посчитают за конец предложения):
regexTest = System.Text.RegularExpressions.Regex.Replace(regexTest, @"(?<=[^\!\.\?\r\n]{9,650})(?<!Mr|Mrs|Miss|Ms|Dr|\W\w)[\!\.\?]\ (?=[\w][^\.\r\n]{8,650})", ".\r\n", System.Text.RegularExpressions.RegexOptions.Multiline|System.Text.RegularExpressions.RegexOptions.IgnoreCase );
// разбиваем строки с началом на Mr, Mrs, Miss, Ms, Dr (ошибочно недоразбитые в предыдущем шаге):
regexTest = System.Text.RegularExpressions.Regex.Replace(regexTest, @"(?<=[^\s])\.\ (?=Mr\.\ |Mrs\.\ |Miss\.\ |Ms\.\ |Dr\.\ )", ".\r\n", System.Text.RegularExpressions.RegexOptions.IgnoreCase );

// удаляем строки, где в конце нет знаков !?.:
regexTest = System.Text.RegularExpressions.Regex.Replace(regexTest, @"^.*[^\.\!\?](\r\n)", "", System.Text.RegularExpressions.RegexOptions.Multiline);
// удаляем строки, где мало символов, количество задается в настройках проекта, а регулярку я прописал в первых блоках (^.{0,60}\r\n):
regexTest = System.Text.RegularExpressions.Regex.Replace(regexTest, "^.{0,30}\r\n", "", System.Text.RegularExpressions.RegexOptions.Multiline);
// удаляем строки где есть какие-то экзотические (включая кириллицу) символы кроме перечисленных:
regexTest = System.Text.RegularExpressions.Regex.Replace(regexTest, @"^.*[^ \n\r\-\:\(\)\\—\.\,\%\”\“\’\;\!\?\'\""\$\&\#\w\–\+]+.*\r\n", "", System.Text.RegularExpressions.RegexOptions.Multiline);
// удаляем строки где есть ссылки(www. или http):
regexTest = System.Text.RegularExpressions.Regex.Replace(regexTest, @"^.*(www\.|http|\*\r\n", "\r\n", System.Text.RegularExpressions.RegexOptions.Multiline);
// удаляем строки, которые начинаются НЕ с заглавной буквы (лучше потом на С# по списку сделать):
//regexTest = System.Text.RegularExpressions.Regex.Replace(regexTest, @"^[^A-ZА-ЯЁ].+\r\n", "", System.Text.RegularExpressions.RegexOptions.Multiline);
// удаляем строки, где мало слов, количество задается в настройках проекта, а регулярку я прописал в первых блоках (^[^ \r\n$]*( +[^ \r\n$]*){0,4}\r\n):
regexTest = System.Text.RegularExpressions.Regex.Replace(regexTest, @"(^[^ \r\n$]*( +[^ \r\n$]*){0,3}\r\n)", "", System.Text.RegularExpressions.RegexOptions.Multiline);
// удаляем строки, где от 30 шт. не буквенно-циферных знаков (типа много мусора):
regexTest = System.Text.RegularExpressions.Regex.Replace(regexTest, @"^[\w ]*([^\w\r\n$ ][\w ]*){10,}\r\n", "", System.Text.RegularExpressions.RegexOptions.Multiline);
// удаляем строки, где подряд от 4 шт. не буквенно-циферных знаков (мусор):
regexTest = System.Text.RegularExpressions.Regex.Replace(regexTest, @"^[\w ]*([^\w\r\n$ ]{4,}[\w ]*)\r\n", "", System.Text.RegularExpressions.RegexOptions.Multiline);
// удаляем пустые строки:
regexTest = System.Text.RegularExpressions.Regex.Replace(regexTest, @"\n\r", "", System.Text.RegularExpressions.RegexOptions.Multiline);
// опять заменяем многоточие на 1 точку:
regexTest = System.Text.RegularExpressions.Regex.Replace(regexTest, @"(?<=[^\.])\.{2,}(?=[^\.])", ".", System.Text.RegularExpressions.RegexOptions.Multiline);
// удаляем лишние повторение знаков препинания в конце строки:
regexTest = System.Text.RegularExpressions.Regex.Replace(regexTest, @" ?([\.\!\?\:\,\:\;\ ]){2,}(?=\r\n|$)", ".", System.Text.RegularExpressions.RegexOptions.Multiline);
// удаляем перед знаками .,:; ненужные пробелы:
regexTest = System.Text.RegularExpressions.Regex.Replace(regexTest, @"\ (\.|\,|\:|\", "$1", System.Text.RegularExpressions.RegexOptions.Multiline);

// в финальный список берем только строки начинающиесе с заглавной буквы или цифры:
List <string> Snippets_2 = new List <string>();
var splitter = "\r\n";
foreach (string x in regexTest.Split(new String[] {splitter}, StringSplitOptions.RemoveEmptyEntries))
{
    if (char.IsUpper(x, 0) || char.IsDigit(x, 0))
    {
        Snippets_2.Add(x);
    }
}

var Snippets_List_To_STring = string.Join("\r\n",Snippets_2);
return Snippets_List_To_STring;
 

Кто просматривает тему: (Всего: 1, Пользователи: 0, Гости: 1)