Python Linux: захватить все строки, которые могут быть написаны вперед и назад в текстовом файле - PullRequest
0 голосов
/ 07 июня 2018

Мне нужно захватить все строки палиндрома (пишутся одинаково вперед и назад) в текстовом файле из командной строки linux.Я не думаю, что вы можете использовать только одну команду для этого, так как вы должны проверить для любой длины строки.Поэтому я не знаю способа сделать это, кроме как сделать сценарий (поправьте меня, если я ошибаюсь).Поэтому я взял все длины строк и выполнил команду grep, которая проверила бы такие длинные строки:

import os

ex_front = "egrep -i '^"
ex_middle_front = ""
ex_middle_back = ""
ex_back = "$' textfile.txt"

textFile = open("textfile.txt", "r")
stringList = textFile.readlines()
lengthList = set([])

for line in stringList:
    lengthList.add(len(line))

for x in lengthList:
    ex_middle_front = ""
    ex_middle_back = ""

    for i in range(int(x/2), 0, -1):
        ex_middle_front += "(.)"
        ex_middle_back += "\\" + str(i)

    if x % 2 == 0:
        ex_middle = ""
    else:
        ex_middle = "."

    os.system(ex_front + ex_middle_front + ex_middle + ex_middle_back + ex_back)

Это работает, но мне интересно, есть ли лучшее решение.

Ответы [ 2 ]

0 голосов
/ 07 июня 2018

Я не уверен, зачем вам здесь регулярные выражения.Вернитесь к определению палиндрома: пишется одинаково вперед и назад.то есть.линия будет такой же, как линия назад.Поэтому все, что вам нужно проверить в коде, это обратная версия строки против строки.Пример кода ниже с комментариями:

palindromes = []
with open('textfile.txt') as f:
    for line in f:

        # remove trailing newlines
        line = line.strip()

        # 'if line' makes sure the line isn't empty
        # line[::-1] is shorthand for reversing the string
        if line and line == line[::-1]:

            # so here line is a palindrome
            # do what you want with it
            palindromes.append(line)

print(palindromes)
0 голосов
/ 07 июня 2018

Вот один из способов:

def is_palindrome(x):
    return x == x[::-1]

with open('so_palindromes.txt', 'r') as f:
    for line in map(lambda x: x.rstrip(), f):
        if is_palindrome(line):
            print(line)

Тестовый файл:

lol
not
really
a
palindrome
yay
hah

Вывод:

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