У меня есть текстовый файл, содержащий случайные строки. Я хочу использовать определенные критерии для извлечения строк, соответствующих этим критериям.
Пример текста:
B311-SG-1700-ASJND83-ANSDN762 BAKSJD873-ЯНВ-1293
Пример критериев:
Все строки, содержащие символы, разделенные дефисом таким образом: XXX-XX-XXXX
Выход: «B311-SG-1700».
Я попытался создать функцию, но, похоже, не знаю, как конкретно использовать критерии для строки и как их применять.
Привет ! Мне так жаль, что я забыл. Язык программирования — Python 3.8. По сути, я пытаюсь извлечь эти строки (разделенные пробелами или символами новой строки) и записать их в текстовый файл построчно. После этого текстовый файл будет преобразован в формат .csv.
Вы можете использовать модуль 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) с любыми символами, которые могут появиться первыми. Пример: пробел, дефис, запятая... и т.д.
Не могли бы вы привести несколько примеров с ожидаемыми результатами? "\b" означает границу слова. Вы можете заменить это на ".?" (например, ".?(.{4}-.{2}-.{4})"), что означает любой символ или ни одного. С помощью скобок вы можете контролировать, какая часть должна быть включена в результат (так называемая группа захвата). Таким образом, что-то вроде "BAKSJD873-JA-1293" будет также включено в результат "D873-JA-1293". Для определенных символов вместо ".?" вы можете использовать, например. "[-.,\w]?" что ограничит символы теми, что в скобках. Взгляните на «метасимволы» регулярных выражений, похожие на «\b» или «\w» (пробелы).
Да, конечно, поэтому в основном то, что я хочу для выходных данных, - это список, содержащий строки со следующими конкретными критериями: 1- строки должны быть длиной 11 символов (включая дефисы) 2- должны начинаться с буквы 3- не может быть пробелов в строка 4- последние 4 символа числа 5- 2 символа между дефисами должны быть буквами я действительно не знаком с синтаксисом вот почему.
Насколько я понимаю, вы ищете "[a-zA-Z][^\s]{3}-[a-zA-Z]{2}-\d{4}", что означает "Символ в диапазоне от a до Z, 3 символа, которые не являются пробелами, тире, 2 символа в диапазоне от a до Z, тире, 4 символа, которые являются числами. Вы можете попробовать здесь: regex101.com/r/x9FqCm/1
Привет. Можете ли вы объяснить немного больше, чего вы пытаетесь достичь? Я так понимаю, что у вас строки разделены пробелами, а не новыми строками? И вы хотите сопоставить определенную часть этих строк? Чего я не понимаю, так это того, что ваш пример «XXX-XX-XXXX» не соответствует ожидаемому результату «B311-SG-1700». Я предполагаю, что вы можете использовать Regex. Может работать что-то вроде этого: "\b.{4}-.{2}-.{4}", что будет соответствовать всему, начинающемуся с границы слова (например, пробела или начала). Также может быть полезно знать, с каким языком программирования вы работаете. Смотрите также regex101.com/r/8hVqbI/1