Извлечение определенных буквенно-цифровых шаблонов из длинной строки - PullRequest
2 голосов
/ 20 мая 2019

Я хочу сопоставить номер группы и группу их строк из текста, подобного этому:

domain 1 
654789 text (one or more lines)
domain 2
125478 text (one or more lines)

Я хочу получить:

domain 1 654789
domain 2 125478

Мой код:

import re
from re import match

domain = re.compile(r'[-+]?domain')
terminal = re.compile(r'^[0-9][0-9]{6}(?!\d)')        
with open('in_texto.txt') as file_in:
    for linea in file_in:
        for match in re.finditer(domain, linea):
            dom = re.findall('\d+', linea)[0]
            print(dom)
            for lineas in file_in:
                for match in re.finditer(terminal, lineas):
                    print(dom+" "+lineas, end='')

Но он печатает только:

654789 text
956478 text
125478 text
 .....

Как мне решить эту проблему?

Ответы [ 2 ]

1 голос
/ 20 мая 2019

Вот решение с использованием модуля regex (на самом деле он работает точно так же, используя re)

# import regex  # or re - then subsitute regex.split for re.split etc.
# string = 'domain 1 \ntotal.....\n======= \n\n654789 text \n956478 text\ndomain 2\n======= \ncolumn..... \n\n\n125478 text \n456987 text '

domains = regex.split(r'domain \d+', string)
out = list()
for k in range(1, len(domains)):
    out.extend(['domain {} {}'.format(k, d) for d in regex.findall(r'\d+(?=\s*text)', domains[k])])
out
# ['domain 1 654789', 'domain 1 956478', 'domain 2 125478', 'domain 2 456987']
  • Сначала мы разбиваем необработанную текстовую строку по доменам.
  • Затем для каждого домена мы получаем цифры с использованием регулярного выражения \d+(?=\s*text).
  • Наконец, мы обрабатываем извлеченные цифры, добавляем соответствующий домен и добавляем результат в наш список.
0 голосов
/ 20 мая 2019

Один из подходов заключается в том, чтобы сначала извлечь домены.Это работает, определяя строку домена, а затем весь текст до следующей строки домена.Затем он разбивает каждый из них на строки и извлекает только строки, начинающиеся с 6 цифр:

import re

terminal = re.compile(r'(\d+){6}\s+')  

with open('in_texto.txt') as file_in:
    for domain, lines in re.findall(r'^(domain\s+\d+?)(.*?)(?=^domain|\Z)', file_in.read(), re.M + re.S):
        for line in lines.splitlines():
            t = terminal.match(line)

            if t:
                print(domain, t.group())

Это даст вам что-то вроде:

domain 1 654789 
domain 1 956478 
domain 2 125478 
domain 2 456987 
domain 2 236512 
domain 3 369852 
domain 3 548723
...