Regex: как «отступить» - PullRequest
       7

Regex: как «отступить»

3 голосов
/ 20 декабря 2010

У меня возникли проблемы с приготовлением регулярного выражения, которое дает такой результат:

Майк 1 , Миша 1,2 , Мигель 1,2,3,4,5,6,7,18 и Мичея 2,3

Как сделать шаг назад в регулярном выражении и отбросить последний матч? То есть мне нужна запятая перед пробелом, чтобы не совпадать. Это то, что я придумал ...

\d+(,|\r)

Майк 1, Миша 1,2, Мигель 1,2,3,4,5,6,7,18, и Мишель 2,3

Ответы [ 2 ]

2 голосов
/ 20 декабря 2010

Функция регулярного выражения, о которой вы спрашиваете, называется положительным взглядом позади . Но в твоем случае я не думаю, что тебе это нужно. Попробуйте это:

\d+(?:,\d+)*

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

Вот небольшой фрагмент тестового кода, написанного на PHP, который проверяет его при вводе:

<?php
$input = "Mike1, misha1,2, miguel1,2,3,4,5,6,7,18, and Micheal2,3";
$matches = array();
preg_match_all('/\d+(?:,\d+)*/', $input, $matches);
print_r($matches[0]);
?>

выходы:

Array
(
    [0] => 1
    [1] => 1,2
    [2] => 1,2,3,4,5,6,7,18
    [3] => 2,3
)
0 голосов
/ 20 декабря 2010

Я верю \d+,(?!\s) будет делать то, что вы хотите. ?! - это отрицательный прогноз , который соответствует, только если то, что следует за ?!, не не появляется в этой позиции в строке поиска.

>>> re.findall(r'\d+,(?!\s)', 'Mike1, misha1,2, miguel1,2,3,4,5,6,7,18, and Michea2,3')
['1,', '1,', '2,', '3,', '4,', '5,', '6,', '7,', '2,']

Или, если вы хотите сопоставить разделенный запятыми список чисел, исключая запятую, используйте \d+(?:,\d+)*.

>>> re.findall(r'\d+(?:,\d+)*', 'Mike1, misha1,2, miguel1,2,3,4,5,6,7,18, and Michea2,3')
['1', '1,2', '1,2,3,4,5,6,7,18', '2,3']
...