Я ищу способ извлечь строки из текстового файла, используя определенные критерии

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

Пример текста:

B311-SG-1700-ASJND83-ANSDN762 BAKSJD873-ЯНВ-1293

Пример критериев:

Все строки, содержащие символы, разделенные дефисом таким образом: XXX-XX-XXXX

Выход: «B311-SG-1700».

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

Привет. Можете ли вы объяснить немного больше, чего вы пытаетесь достичь? Я так понимаю, что у вас строки разделены пробелами, а не новыми строками? И вы хотите сопоставить определенную часть этих строк? Чего я не понимаю, так это того, что ваш пример «XXX-XX-XXXX» не соответствует ожидаемому результату «B311-SG-1700». Я предполагаю, что вы можете использовать Regex. Может работать что-то вроде этого: "\b.{4}-.{2}-.{4}", что будет соответствовать всему, начинающемуся с границы слова (например, пробела или начала). Также может быть полезно знать, с каким языком программирования вы работаете. Смотрите также regex101.com/r/8hVqbI/1

Wolfspirit 24.11.2022 20:00

Привет ! Мне так жаль, что я забыл. Язык программирования — Python 3.8. По сути, я пытаюсь извлечь эти строки (разделенные пробелами или символами новой строки) и записать их в текстовый файл построчно. После этого текстовый файл будет преобразован в формат .csv.

Jeza 24.11.2022 20:43
В чем разница между методом "==" и equals()
В чем разница между методом "==" и equals()
Это один из наиболее часто задаваемых вопросов новичкам на собеседовании. Давайте обсудим его на примере.
Замена символа по определенному индексу в JavaScript
Замена символа по определенному индексу в JavaScript
В JavaScript существует несколько способов заменить символ в строке по определенному индексу.
1
2
53
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вы можете использовать модуль re для извлечения шаблона из текста:

import re

text = """\
B311-SG-1700-ASJND83-ANSDN762 BAKSJD873-JAN-1293
BAKSJD873-JAN-1293 B312-SG-1700-ASJND83-ANSDN762"""

for m in re.findall(r"\b.{4}-.{2}-.{4}", text):
    print(m)

Отпечатки:

B311-SG-1700
B312-SG-1700
Ответ принят как подходящий

Основываясь на вашем комментарии, вот скрипт python, который может делать то, что вы хотите (я не очень хорошо знаком с python).

import re

p = re.compile(r'\b(.{4}-.{2}-.{4})')

results = p.findall('B111-SG-1700-ASJND83-ANSDN762 BAKSJD873-JAN-1293\nB211-SG-1700-ASJND83-ANSDN762 BAKSJD873-JAN-1293 B311-SG-1700-ASJND83-ANSDN762 BAKSJD873-JAN-1293')

print(results)

Выход: ['B111-SG-1700', 'B211-SG-1700', 'B311-SG-1700']

Вы можете прочитать файл как строку, подобную этой

text_file = open("file.txt", "r")
data = text_file.read()

И используйте findall над этим. В зависимости от размера файла может потребоваться немного больше работы (например, чтение построчно, например

Спасибо за ответ. Мне это немного помогло. Я предполагаю, что теперь мой вопрос будет заключаться в том, есть ли способ извлечь одну и ту же конкретную строку (XXXX-XX-XXXX) с любыми символами, которые могут появиться первыми. Пример: пробел, дефис, запятая... и т.д.

Jeza 24.11.2022 21:37

Не могли бы вы привести несколько примеров с ожидаемыми результатами? "\b" означает границу слова. Вы можете заменить это на ".?" (например, ".?(.{4}-.{2}-.{4})"), что означает любой символ или ни одного. С помощью скобок вы можете контролировать, какая часть должна быть включена в результат (так называемая группа захвата). Таким образом, что-то вроде "BAKSJD873-JA-1293" будет также включено в результат "D873-JA-1293". Для определенных символов вместо ".?" вы можете использовать, например. "[-.,\w]?" что ограничит символы теми, что в скобках. Взгляните на «метасимволы» регулярных выражений, похожие на «\b» или «\w» (пробелы).

Wolfspirit 24.11.2022 22:01

Да, конечно, поэтому в основном то, что я хочу для выходных данных, - это список, содержащий строки со следующими конкретными критериями: 1- строки должны быть длиной 11 символов (включая дефисы) 2- должны начинаться с буквы 3- не может быть пробелов в строка 4- последние 4 символа числа 5- 2 символа между дефисами должны быть буквами я действительно не знаком с синтаксисом вот почему.

Jeza 25.11.2022 14:41

Насколько я понимаю, вы ищете "[a-zA-Z][^\s]{3}-[a-zA-Z]{2}-\d{4}", что означает "Символ в диапазоне от a до Z, 3 символа, которые не являются пробелами, тире, 2 символа в диапазоне от a до Z, тире, 4 символа, которые являются числами. Вы можете попробовать здесь: regex101.com/r/x9FqCm/1

Wolfspirit 25.11.2022 15:45

Другие вопросы по теме