Во-первых, отметим некоторое понимание того, какая математическая задача будет полезна для оптимизации, которая в противном случае может ускорить выполнение. Кратко рассмотрев, я могу определить, что есть несколько вещей, в том числе:
"steps 1"
в solve.txt, это никогда не может быть так, поскольку S равно как минимум 2 (или более ) и вы проверяете, если steps == S
# since once 'S' isn't found, n >= S will not be in solve.txt
S = 2
while ("steps " + str(S)) in open('solve.txt').read() and S < 8:
S += 1
.start()
только когда [ 115] и y = 2002
. Это немедленно приводит к тому, что значение result
становится равным 0, и, следовательно, результаты не сохраняются (длина 0 равна 1), возвращаясь без ввода-вывода. Вы хотели бы сделать что-то вроде этого (не проверено): def driver(start, end, step):
for i in range(start, end+1, step):
per1(i)
p1 = multiprocessing.Process(target=driver, args=(1, 2000, 2))
p2 = multiprocessing.Process(target=driver, args=(0, 2000, 2))
p1.start()
p2.start()
p1.join()
p2.join()
Используя регулярные выражения для получения по запросу значений от HTML всегда ошибка. Синтаксис HTML намного более сложен, что это может сначала появиться, и для страницы очень легко ловить даже очень сложное регулярное выражение.
Используйте Синтаксический анализатор HTML вместо этого. См. также, Каковы за и против ведущего Java синтаксические анализаторы HTML?
Вопреки популярному мнению регулярные выражения являются полезными инструментами для извлечения данных из неструктурированного текста (который HTML).
Если Вы делаете, сложное извлечение данных HTML (скажите, найдите все абзацы на странице), затем, парсинг HTML является, вероятно, способом пойти. Но если бы просто необходимо получить некоторые URL от HREFs, затем регулярное выражение хорошо работало бы, и будет очень трудно повредить его.
Попробуйте что-то вроде этого:
/<a[^>]+href=["']?([^'"> ]+)["']?[^>]*>/i
Регулярные выражения могут только проанализировать регулярные языки, вот почему их называют регулярными выражениями. HTML не является регулярным языком, следовательно он не может быть проанализирован регулярными выражениями.
Синтаксические анализаторы HTML, с другой стороны, могут проанализировать HTML, вот почему их называют синтаксическими анализаторами HTML.
Необходимо использовать Вас любимый синтаксический анализатор HTML вместо этого.
Я искал Библиотеку регулярных выражений (http://regexlib.com/Search.aspx?k=href и http://regexlib.com/Search.aspx?k=src)
Лучшее, которое я нашел, было
((?<html>(href|src)\s*=\s*")|(?<css>url\())(?<url>.*?)(?(html)"|\))
Проверьте эти ссылки для большего количества выражений:
http://regexlib.com/REDetails.aspx?regexp_id=2261
http://regexlib.com/REDetails.aspx?regexp_id=758
Если Вы хотите спуститься по маршруту парсинга HTML, который Dave и который я рекомендую здесь, является кодом, чтобы проанализировать Строковые Данные для тегов привязки и распечатать их href.
начиная с Ваших просто тегов привязки использования необходимо согласиться только с regex, но если Вы хотите сделать, больше идет с синтаксическим анализатором. Синтаксический анализатор HTML Mozilla является лучшим там.
File parserLibraryFile = new File("lib/MozillaHtmlParser/native/bin/MozillaParser" + EnviromentController.getSharedLibraryExtension());
String parserLibrary = parserLibraryFile.getAbsolutePath();
// mozilla.dist.bin directory :
final File mozillaDistBinDirectory = new File("lib/MozillaHtmlParser/mozilla.dist.bin."+ EnviromentController.getOperatingSystemName());
MozillaParser.init(parserLibrary,mozillaDistBinDirectory.getAbsolutePath());
MozillaParser parser = new MozillaParser();
Document domDocument = parser.parse(data);
NodeList list = domDocument.getElementsByTagName("a");
for (int i = 0; i < list.getLength(); i++) {
Node n = list.item(i);
NamedNodeMap m = n.getAttributes();
if (m != null) {
Node attrNode = m.getNamedItem("href");
if (attrNode != null)
System.out.println(attrNode.getNodeValue());
Не используйте использование регулярных выражений NekoHTML или TagSoup, которые являются мостом, обеспечивающим SAX или DOM как в подходе XML к посещению документа HTML.
Другие ответы верны. Java Regex API не является надлежащим инструментом для достижения цели. Используйте эффективный, безопасный, и хорошо протестировал высокоуровневые инструменты, упомянутые в других ответах.
Если Ваш вопрос касается скорее Regex API, чем реальная проблема (изучение целей, например) - можно сделать это со следующим кодом:
String html = "foo <a href='link1'>bar</a> baz <a href='link2'>qux</a> foo";
Pattern p = Pattern.compile("<a href='(.*?)'>");
Matcher m = p.matcher(html);
while(m.find()) {
System.out.println(m.group(0));
System.out.println(m.group(1));
}
И вывод:
<a href='link1'>
link1
<a href='link2'>
link2
Обратите внимание на то, что ленивый/отказанный спецификатор *? должен использоваться для сокращения группировки до единственного тега. Группа 0 является всем соответствием, группа 1 является следующим соответствием группы (следующая пара круглой скобки).