Получить полное слово (а), зная только его часть - PullRequest
0 голосов
/ 16 июня 2020

Я просматриваю текстовый файл построчно и хочу вернуть все строки, содержащие префикс AAAXX1234 . Например, в моем текстовом файле у меня есть эти строки

Здравствуйте, мой идентификатор - [123423819 :: AAAXX1234_3412 ] # Я хочу это (AAAXX1234_3412)

Привет, мой ID: [738281937 :: AAAXX1234_3413 : AAAXX1234_4212 ] # Я хочу их обоих (AAAXX1234_3413, AAAXX1234_4212)

Здравствуйте, мой ID: [123423819 :: XXWWF1234_3098] # Меня это не волнует

Код, который у меня есть, чтобы проверить, начинается ли строка с «Привет, мой ID»

with open(file_hrd,'r',encoding='utf-8') as hrd:
    hrd=hrd.readlines()
    for line in hrd:
        if line.startswith("Hello my ID is"):
            #do something

Ответы [ 4 ]

3 голосов
/ 16 июня 2020

Я бы посоветовал вам проанализировать ваши строки и извлечь информацию в значимые части. Таким образом, вы можете использовать простой startswith в части идентификатора вашей строки. Кроме того, это также позволит вам контролировать, где вы найдете эти префиксы, например, в случае, если строки содержат дополнительные данные, которые теоретически могут также содержать что-то похожее на идентификатор.

Примерно так:

if line.startswith('Hello my ID is '):
    idx_start = line.index('[')
    idx_end = line.index(']', idx_start)
    idx_separator = line.index(':', idx_start, idx_end)

    num = line[idx_start + 1:idx_separator]
    ids = line[idx_separator + 2:idx_end].split(':')

    print(num, ids)

Это даст вам следующий результат для ваших трех примерных строк:

123423819 ['AAAXX1234_3412']
738281937 ['AAAXX1234_3413', 'AAAXX1234_4212']
123423819 ['XXWWF1234_3098']

С этой информацией вы можете затем проверить идентификаторы для префикса:

if any(ids, lambda x: x.startswith('AAAXX1234')):
    print('do something')
3 голосов
/ 16 июня 2020

Попробуйте следующее:

import re

with open(file_hrd,'r',encoding='utf-8') as hrd:
    res = []
    for line in hrd:
        res += re.findall('AAAXX1234_\d+', line)
print(res)

Вывод:

['AAAXX1234_3412', 'AAAXX1234_3413', 'AAAXX1234_4212']
2 голосов
/ 16 июня 2020

Использование регулярных выражений через модуль re и его функцию findall() должно быть достаточно:

import re


with open('file.txt') as file:
    prefix = 'AAAXX1234'
    lines = file.read().splitlines()
    output = list()
    for line in lines:
        output.extend(re.findall(f'{prefix}_[\d]+', line))
1 голос
/ 16 июня 2020

Вы можете сделать это с помощью findall с регулярным выражением r'AAAXX1234_[0-9]+', он найдет все части строки, начинающиеся с AAAXX1234_, а затем захватит все числа после него, измените + на *, если вы хотите, чтобы он сам соответствовал 'AAAXX1234_'

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