ИЛИ в регулярном выражении? - PullRequest
2 голосов
/ 23 апреля 2010

У меня есть текстовый файл с несколькими тысячами строк. Я хочу проанализировать этот файл в базе данных и решил написать регулярное выражение. Вот часть файла:

blablabla checked=12 unchecked=1
blablabla unchecked=13
blablabla checked=14

В результате я бы хотел получить что-то вроде

(12,1)
(0,13)
(14,0)

Возможно ли это?

Ответы [ 5 ]

6 голосов
/ 23 апреля 2010

Проще всего использовать два разных регулярных выражения для вытаскивания двух чисел: r" checked=(\d+)" и r" unchecked=(\d+)".

1 голос
/ 23 апреля 2010

Альтернативный подход:

import sys
import re

r = re.compile(r"((?:un)?checked)=(\d+)")

for line in open(sys.argv[1]):
    d = dict( r.findall(line) )
    print d

Вывод:

{'checked': '12', 'unchecked': '1'}
{'unchecked': '13'}
{'checked': '14'}
1 голос
/ 23 апреля 2010
import re

s = """blablabla checked=12 unchecked=1
blablabla unchecked=13
blablabla checked=14"""

regex = re.compile(r"blablabla (?:(?:checked=)(\d+))? ?(?:(?:unchecked=)(\d+))?")

for line in s.splitlines():
    print regex.match(line).groups()

Это дает вам строки (или None, если не найден), но идея должна быть ясной.

1 голос
/ 23 апреля 2010
import re

lines = ["blablabla checked=12 unchecked=1", "blablabla unchecked=13"]

p1 = re.compile('checked=(\d)+\sunchecked=(\d)')
p2 = re.compile('checked=(\d)')
p3 = re.compile('unchecked=(\d)')
for line in lines:
    m = p1.search(line)
    if m:
       print m.group(1), m.group(2)
    else:
        m = p2.search(line)
        if m:
            print m.group(1), "0"
        else:
            m = p2.search(line)
            if m:
                print "0", m.group(1)
0 голосов
/ 25 апреля 2010

Это более общий и многократно используемый, я считаю:

import re

def tuple_producer(input_lines, attributes):
    """Extract specific attributes from lines 'blabla attribute=value …'"""
    for line in input_lines:
        line_attributes= {}
        for match in re.finditer("(\w+)=(\d+)", line):
            line_attributes[match.group(1)]= int(match.group(2)) # int cast
        yield tuple(
            line_attributes.get(attribute, 0) # int constant
            for attribute in wanted_attributes)


>>> lines= """blablabla checked=12 unchecked=1
blablabla unchecked=13
blablabla checked=14""".split("\n")
>>> list(tuple_producer(lines, ("checked", "unchecked")))
[(12, 1), (0, 13), (14, 0)]

# and an irrelevant example
>>> list(tuple_producer(lines, ("checked", "inexistant")))
[(12, 0), (0, 0), (14, 0)]

Обратите внимание на преобразование в целое число; если это нежелательно, удалите кастинг int, а также конвертируйте константу 0 int в "0".

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