Измените регулярное выражение python, чтобы оно соответствовало всем числам с плавающей запятой, а не только первому - PullRequest
0 голосов
/ 22 февраля 2012

У меня есть функция python, которая использует регулярное выражение для сопоставления с одним (первым) числом с плавающей запятой в данной строке и возвращает число.

Как я могу изменить его (регулярное выражение) для обобщенияфункция, чтобы она вместо этого возвращала список со всеми числами в строке?

Вот рабочая демонстрация:

    import re

    def extract_number(s,notfound='NOT_FOUND'):
        regex='[-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?' # matching any floating point number 
        m = re.search(regex,s)
        if(m): val=m.group()
        else: val=notfound
        return val

    example='bla1.23bar4.5fuzz6.7cat8'

    print example
    print extract_number(example)

В этом примере вывод:

bla1.23bar4.5fuzz6.7cat8
1.23

Модифицированная функция, которую я ищу, назовем ее extract_numbers (обратите внимание на множественное число!), Должна вывести это:

bla1.23bar4.5fuzz6.7cat8
[1.23, 4.5, 6.7, 8]

Ответы [ 3 ]

0 голосов
/ 22 февраля 2012

Просто используйте re.findall :

def extract_number(s,notfound='NOT_FOUND'):
    regex=r'[-+]?[0-9]*\.?[0-9]+(?:[eE][-+]?[0-9]+)?'
    return re.findall(regex,s)
0 голосов
/ 22 февраля 2012

Главное изменение, используйте findall.

def extract_number(s, notfound='NOT_FOUND'):
    regex = '[-+]?[0-9]+(?:\.[0-9]+)?(?:[eE][-+]?[0-9]+)?' # matching any floating point number 
    m = re.findall(regex, s)
    if(m): val = m
    else: val = notfound
    return val
  • Я также немного изменил ваше регулярное выражение, потому что ваш оригинал возвратил только пустые строки с findall из-за группы захвата.

  • m.group также больше не работает, поскольку findall возвращает список строк, а search возвращает MatchObject

0 голосов
/ 22 февраля 2012

Если ваше регулярное выражение работает для отдельных чисел, вы можете использовать re.finditer:

re.finditer(r'[-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?', 'bla1.23bar4.5fuzz6.7cat8')

, поэтому с

def extract_numbers(txt):
    for m in re.finditer(r'[-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?', txt):
        yield float(m.group(0))

вы можете получить все числа:

list(extract_numbers('bla1.23bar4.5fuzz6.7cat8'))

возвращает

[1.23, 4.5, 6.7000000000000002, 8.0]
...