Регулярное выражение для разделения на пробелах, если в кавычках

Нижеприведенный код является решением вопроса на Python 3. Перед запуском кода убедитесь, что вы установили библиотеку PyPDF2 в свою среду. Если не установлено, откройте командную строку и выполните следующую команду:

pip3 install PyPDF2

Код решения:

import PyPDF2
pdfFileObject = open('sample.pdf', 'rb')
pdfReader = PyPDF2.PdfFileReader(pdfFileObject)
count = pdfReader.numPages
for i in range(count):
    page = pdfReader.getPage(i)
    print(page.extractText())
66
задан Chad Birch 3 April 2009 в 21:49
поделиться

8 ответов

Никакие опции не потребовали

Regex:

\w+|"[\w\s]*"

C#:

Regex regex = new Regex(@"\w+|""[\w\s]*""");

Или если необходимо исключить "символы:

    Regex
        .Matches(input, @"(?<match>\w+)|\""(?<match>[\w\s]*)""")
        .Cast<Match>()
        .Select(m => m.Groups["match"].Value)
        .ToList()
        .ForEach(s => Console.WriteLine(s));
63
ответ дан Bartek Szabat 7 November 2019 в 11:13
поделиться

Этот regex разделит на основе случая, который Вы дали выше, хотя он не разделяет кавычки или дополнительные пространства, таким образом, можно хотеть сделать некоторую обработку сообщения на строках. Это должно правильно держать заключенные в кавычки строки вместе все же.

"[^"]+"|\s?\w+?\s
4
ответ дан John Conrad 7 November 2019 в 11:13
поделиться

Shaun,

я полагаю, что следующий regex должен сделать это

(?<=")\w[\w\s]*(?=")|\w+  

С уважением,
Lieven

1
ответ дан Lieven Keersmaekers 7 November 2019 в 11:13
поделиться

С определенным беспорядком регулярные языки могут отслеживать ровный/нечетный подсчет кавычек, но если Ваши данные могут включать оставленные кавычки (\, ") затем Вы находитесь в реальном создании проблемы или понимании регулярного выражения, которое обработает это правильно.

2
ответ дан Liudvikas Bukys 7 November 2019 в 11:13
поделиться

Смотрите на LSteinle's" Функция Разделения, которой текстовыми Спецификаторами Поддержек " в проекте

Кода Вот является отрывок из его проекта этим you’re, заинтересованный.

using System.Text.RegularExpressions;

public string[] Split(string expression, string delimiter, string qualifier, bool ignoreCase)
{
    string _Statement = String.Format("{0}(?=(?:[^{1}]*{1}[^{1}]*{1})*(?![^{1}]*{1}))", 
                        Regex.Escape(delimiter), Regex.Escape(qualifier));

    RegexOptions _Options = RegexOptions.Compiled | RegexOptions.Multiline;
    if (ignoreCase) _Options = _Options | RegexOptions.IgnoreCase;

    Regex _Expression = New Regex(_Statement, _Options);
    return _Expression.Split(expression);
}

Просто не упускают вызов этого в цикле как его создание и компиляция оператора Regex каждый раз, когда Вы называете его. Таким образом, если бы необходимо назвать его более затем несколько разы, я посмотрел бы на создание кэша Regex некоторого вида.

0
ответ дан Adam L 7 November 2019 в 11:13
поделиться

РЕДАКТИРОВАНИЕ: Извините за мое предыдущее сообщение это очевидно возможно.

Для обработки всех неалфавитно-цифровых символов Вам нужно что-то вроде этого:

MatchCollection matchCollection = Regex.Matches(input, @"(?<match>[^""\s]+)|\""(?<match>[^""]*)""");
foreach (Match match in matchCollection)
        {
            yield return match.Groups["match"].Value;
        }

можно сделать foreach более умное при использовании .NET> 2.0

1
ответ дан Grzenio 7 November 2019 в 11:13
поделиться

Решение Lieven получает большую часть пути там, и как он заявляет в своих комментариях, это - просто вопрос изменения окончания к решению Bartek. Конечным результатом является следующая работа regEx:

(?<=")\w[\w\s]*(?=")|\w+|"[\w\s]*"

Вход: Вот "моя строка", она имеет "шесть соответствий"

Вывод:

  1. Здесь
  2. "моя строка"
  3. это
  4. имеет
  5. "шесть соответствий"

К сожалению, это включает кавычки. Если Вы вместо этого используете следующее:

(("((?<token>.*?)(?<!\\)")|(?<token>[\w]+))(\s)*)

И явно получите "маркерные" соответствия следующим образом:

    RegexOptions options = RegexOptions.None;
    Regex regex = new Regex( @"((""((?<token>.*?)(?<!\\)"")|(?<token>[\w]+))(\s)*)", options );
    string input = @"   Here is ""my string"" it has   "" six  matches""   ";
    var result = (from Match m in regex.Matches( input ) 
                  where m.Groups[ "token" ].Success
                  select m.Groups[ "token" ].Value).ToList();

    for ( int i = 0; i < result.Count(); i++ )
    {
        Debug.WriteLine( string.Format( "Token[{0}]: '{1}'", i, result[ i ] ) );
    }

Отладка произвела:

Token[0]: 'Here'
Token[1]: 'is'
Token[2]: 'my string'
Token[3]: 'it'
Token[4]: 'has'
Token[5]: ' six  matches'
16
ответ дан Timothy Walters 24 November 2019 в 15:03
поделиться

Если вы хотите взглянуть на общее решение этой проблемы в виде бесплатного объекта javascript с открытым исходным кодом, вы можете посетить http: // splitterjsobj .sourceforge.net / для живой демонстрации (и загрузки). Объект имеет следующие особенности:

  • Пары определяемых пользователем кавычек могут использоваться для выхода за пределы разделителя (предотвращение разделения внутри кавычек). Кавычки можно экранировать с помощью определяемого пользователем escape-символа и / или «экранирования двойных кавычек». Эскейп-символ может быть экранирован (с самим собой). В одном из 5 выходных массивов (свойствах объекта) вывод неэкранирован. (Например, если escape-символ = /, "a ///" b "неэкранируется как a /" b)
  • Разделить на массив разделителей; проанализировать файл за один вызов. (Выходные массивы будут вложенными.)
  • Все escape-последовательности, распознаваемые javascript, могут быть оценены в процессе разделения и / или в препроцессе.
  • Функциональность обратного вызова
  • Совместимость между браузерами

Объект также доступен как плагин jQuery, но как новый пользователь на этом сайте я могу включить только одну ссылку в это сообщение.

0
ответ дан 24 November 2019 в 15:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: