Python - Найти строку в файле определенной длины, причем строка должна быть только прописной и числовой. - PullRequest
1 голос
/ 16 июня 2020

Я хочу найти строку определенной длины - например, 7 символов. Строка должна содержать только прописные буквы и цифры. У меня есть идеи: прочитать файл построчно ...

Я не уверен, что лучше всего здесь - прочитать весь файл одним блоком или прочитать файл построчно, используя al oop? Вам нужно использовать al oop для чтения файла построчно?

# read lines in text file
filetoread=open("mytextfile.txt")

for lines in filetoread  # right ?
 #just an example of a given string of text (not from the file)
    characters = "D123456"
    for x in characters:
        if x == "D":
            print ("found letter", x)

Но в моем сценарии я не знаю, какие символы будут присутствовать в моей строке длиной 7 символов, поэтому я не могу очевидно, ищите "D".

Итак, у меня есть идеи, что мне нужно прочитать файл, проверить строку длиной 7 (я не уверен, как обрабатывать такие вещи в файле, как это:

строка 1: My path = "7characters" (так что в основном находим даже подстроки, которые соответствовали бы 7 символам, которые содержат прописные буквы и цифры c

Я не знаю, это просто, но я не Думаю, я понимаю основы c лог c, стоящие за этим.

Ответы [ 3 ]

1 голос
/ 16 июня 2020

Построчное чтение было бы опцией в файле super giganti c. Но для обычных файлов было бы проще просто прочитать весь файл сразу.

Мой код предназначен для обычных символов, поэтому никаких специальных букв Ë и Ô.

import re

with open("somefile.txt") as file:
   data = file.read()
   result = re.findall(r'\b[A-Z0-9]{7}\b', data)
   print(result)

объяснение обычного выражения:

\b[A-Z0-9]{7}\b
\b = beginning or end of a word
[A-Z] letter range: any letter from capital A to capital Z
[0-9] number range: any number from 0 to 9
{7} length of 7 chars of what is specified in front of it [A-Z0-9]
\b beginning or end of word
0 голосов
/ 16 июня 2020

В общем, регулярные выражения (regex) - это наиболее краткий и быстрый способ поиска строк, соответствующих определенным критериям в файле. Я рекомендую использовать инструмент RegEXR для разработки регулярного выражения для каждого конкретного c варианта использования, который может у вас возникнуть. Для вашего случая (поиск 7 последовательных символов верхнего регистра или цифр c в файле) я бы сделал что-то вроде этого:

import re

# with open("examplefile.txt") as f:
#     text = f.read()

# This is just an example, since I don't have your text file
text = """
Lorem Ipsum is simply dummy text of the printing and typesetting industry. 
Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, 
when an unknown printer took a G4LL3YS of type and scrambled it to make a type specimen book. 
It has survived not only five centuries, but also the leap into ELEC7R0NIC typesetting, remaining essentially unchanged.
It was popularised in the 19601970s with the release of LETRASET sheets containing Lorem Ipsum passages, 
and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum.
"""
# Searches fo the pattern in the sample text
found_patterns = re.findall(r'([A-Z\d]{7})', text)
# Could also use below, if you only want the first match
# found_patterns = re.search(r'([A-Z\d]{7})', text).group()
print(found_patterns)

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

В юникоде spe c много заглавных букв и цифр. Этот пример нормализует каждую строку файла, а затем проверяет класс символов каждого символа. Если в Юникоде указан верхний регистр, он считается. (Я предполагаю, что у эмодзи не будет версии в верхнем регистре ...).

import unicodedata

def string_finder(filename, length=7):
    with open(filnname) as fp:
        return_chars = []
        for line in fp:
            line = unicodedata.normalize(line.strip())
            for c in line:
                category = unicodedata(c)
                if "LU" in category or "N" in category:
                    return_chars.append(c)
                    if len(return_chars) == length:
                        return "".join(return_chars)
    return None
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...