Нижеприведенный код является решением вопроса на 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())
Никакие опции не потребовали
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));
Этот regex разделит на основе случая, который Вы дали выше, хотя он не разделяет кавычки или дополнительные пространства, таким образом, можно хотеть сделать некоторую обработку сообщения на строках. Это должно правильно держать заключенные в кавычки строки вместе все же.
"[^"]+"|\s?\w+?\s
Shaun,
я полагаю, что следующий regex должен сделать это
(?<=")\w[\w\s]*(?=")|\w+
С уважением,
Lieven
С определенным беспорядком регулярные языки могут отслеживать ровный/нечетный подсчет кавычек, но если Ваши данные могут включать оставленные кавычки (\, ") затем Вы находитесь в реальном создании проблемы или понимании регулярного выражения, которое обработает это правильно.
Смотрите на 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 некоторого вида.
РЕДАКТИРОВАНИЕ: Извините за мое предыдущее сообщение это очевидно возможно.
Для обработки всех неалфавитно-цифровых символов Вам нужно что-то вроде этого:
MatchCollection matchCollection = Regex.Matches(input, @"(?<match>[^""\s]+)|\""(?<match>[^""]*)""");
foreach (Match match in matchCollection)
{
yield return match.Groups["match"].Value;
}
можно сделать foreach более умное при использовании .NET> 2.0
Решение Lieven получает большую часть пути там, и как он заявляет в своих комментариях, это - просто вопрос изменения окончания к решению Bartek. Конечным результатом является следующая работа regEx:
(?<=")\w[\w\s]*(?=")|\w+|"[\w\s]*"
Вход: Вот "моя строка", она имеет "шесть соответствий"
Вывод:
К сожалению, это включает кавычки. Если Вы вместо этого используете следующее:
(("((?<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'
Если вы хотите взглянуть на общее решение этой проблемы в виде бесплатного объекта javascript с открытым исходным кодом, вы можете посетить http: // splitterjsobj .sourceforge.net / для живой демонстрации (и загрузки). Объект имеет следующие особенности:
Объект также доступен как плагин jQuery, но как новый пользователь на этом сайте я могу включить только одну ссылку в это сообщение.