вернуть несколько совпадений, используя re.match или re.search - PullRequest
0 голосов
/ 02 октября 2018

Я конвертирую некоторый код в микропифон , и я застрял на определенном регулярном выражении.

В Python мой код

import re

line = "0-1:24.2.1(180108205500W)(00001.290*m3)"
between_brackets = '\(.*?\)' 

brackettext  = re.findall(between_brackets, line) 
gas_date_str = read_date_time(brackettext[0])
gas_val      = read_gas(brackettext[1])

# gas_date_str and gas_val take the string between brackets 
# and return a value that can later be used

микропифон реализует только ограниченный набор функций

как мне добиться того же, только с ограниченными функциями?

Ответы [ 2 ]

0 голосов
/ 02 октября 2018

Вы можете написать метод, используя re.search(), который возвращает список всех совпадений:

import re  

def find_all(regex, text):
    match_list = []
    while True:
        match  = re.search(regex, text)
        if match:
            match_list.append(match.group(0))
            text = text[match.end():]
        else:
            return match_list

Также обратите внимание, что ваше регулярное выражение between_brackets не позаботится о вложенных скобках:

re.findall('\(.*?\)', "(ac(ssc)xxz)")
>>> ['(ac(ssc)']
0 голосов
/ 02 октября 2018

Вы могли бы сделать что-то по следующим направлениям.Повторно используйте re.search при использовании строки.Реализация здесь использует функцию генератора:

import re

def findall(pattern, string):
    while True:
        match = re.search(pattern, string)
        if not match:
            break
        yield match.group(0)
        string = string[match.end():]

>>> list(findall(r'\(.*?\)', "0-1:24.2.1(180108205500W)(00001.290*m3)"))
['(180108205500W)', '(00001.290*m3)']
...