Существует ли Perl, эквивалентный из re.findall/re.finditer Python (повторяющиеся результаты regex)?

Учитывая сообщение об ошибке, я ожидаю, что вам нужно объявить пространство имен rdf, прежде чем использовать его в имени атрибута rdf:resource.

(Ваша проблема не имеет ничего общего с XPath - она ​​завершается неудачно при попытке проанализировать XML до запуска какого-либо кода XPath.)

6
задан cdleary 22 January 2009 в 01:52
поделиться

3 ответа

Используйте /g модификатор в Вашем соответствии. От perlop руководство:

"/g"модификатор указывает глобальное сопоставление с образцом - то есть, соответствуя максимально много раз в строке. То, как это ведет себя, зависит от контекста. В контексте списка это возвращает список подстрок, подобранных любыми круглыми скобками получения в регулярном выражении. Если нет никаких круглых скобок, это возвращает список всех совпавших строк, как будто были круглые скобки вокруг целого шаблона.

В скалярном контексте, каждом выполнении"m//g"находит следующее соответствие, возвращая true, если это соответствует, и ложь, если нет никакого дальнейшего соответствия. Положение после последнего соответствия может быть считано или установило использование pos() функция; см."posperlfunc. Неудавшееся соответствие обычно сбрасывает поисковое положение к началу строки, но можно избежать этого путем добавления"/c"модификатор (например,".m//gc"). Изменение целевой строки также сбрасывает поисковое положение.

13
ответ дан 8 December 2019 в 05:58
поделиться

Для построения на ответе Chris является, вероятно, самым необходимым монтировать в корпус //g regex в a while цикл, как:

my @matches;
while ( 'foobarbaz' =~ m/([aeiou])/g )
{
    push @matches, $1;
}

Вставка некоторого быстрого Python ввод-вывод:

>>> import re
>>> re.findall(r'([aeiou])([nrs])','I had a sandwich for lunch')
[('a', 'n'), ('o', 'r'), ('u', 'n')]

Для получения чего-то сопоставимого в Perl конструкция могла быть чем-то как:

my $matches = [];
while ( 'I had a sandwich for lunch' =~ m/([aeiou])([nrs])/g )
{
    push @$matches, [$1,$2];
}

Но в целом, безотносительно функции Вы выполняете итерации для, можно, вероятно, сделать в while сам цикл.

7
ответ дан 8 December 2019 в 05:58
поделиться

Хорошая ссылка новичка с подобным содержанием к ответу @kyle: Учебное руководство по Perl: Используя регулярные выражения

2
ответ дан 8 December 2019 в 05:58
поделиться