Настройте Python Regex, чтобы он не включал ни одной цифры в результаты поиска - PullRequest
4 голосов
/ 31 августа 2010

Я пытаюсь захватить / извлечь числовые значения из некоторых строк.

Вот пример строки:

s='The shipping company had 93,999,888.5685 gallons of fuel on hand'

Я хочу получить значение 93 999 888,5685 Я получил свое регулярное выражение в этом

> mine=re.compile("(\d{1,3}([,\d{3}])*[.\d+]*)")

Однако, когда я делаюfindall Я получаю следующее:

mine.findall(s)

[('93,999,888.5685', '8')]

Я попробовал несколько различных стратегий, чтобы не дать ему сравниться на 8

Но теперь я понимаю, что не уверен, что знаю, почемуэто соответствует 8

Любое освещение будет оценено.

Ответы [ 4 ]

4 голосов
/ 01 сентября 2010

Причина захвата восьмерки в том, что у вас есть 2 группы захвата. Отметьте 2-ю группу как группу без захвата, используя ?: с этим шаблоном: (\d{1,3}(?:[,\d{3}])*[.\d+]*)

Ваша вторая группа, ([,\d{3}]) отвечает за дополнительный матч.

1 голос
/ 01 сентября 2010

Ваша строка разбита:

(
\d{1,3}       This will match any group of 1-3 digits (`8`, `12`, `000`, etc)
  (
     [,\d{3}] This will match groups of a "," and 3 digits (`,123`, `,000`, etc)
  )*            **from zero to infinity times**
  [.\d+]*     This matches any number of periods "." and digits from 0 to infinity
)
0 голосов
/ 01 сентября 2010

findall возвращает кортеж для каждого совпадения. Кортеж содержит каждую группу (указана в скобках в регулярном выражении) совпадения. Вы хотите только первую группу. Ниже я использовал понимание списка, чтобы вытащить первую группу.

>>> mine=re.compile("(\d{1,3}(,\d{3})*(\.?\d+)*)")
>>> s='blah 93,999,888.5685 blah blah blah 988,122.3.'
>>> [m[0] for m in mine.findall(s)]
['93,999,888.5685', '988,122.3']
0 голосов
/ 01 сентября 2010

Почему бы не обернуть его в \ D? mine=re.compile("\D(\d{1,3}([,\d{3}])<em>[.\d+]</em>)\D").

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...