Eu tenho algum código python simples que pesquisa arquivos por uma string path=c:\path
, por exemplo , onde a c:\path
parte pode variar. O código atual é:
def find_path(i_file):
lines = open(i_file).readlines()
for line in lines:
if line.startswith("Path="):
return # what to do here in order to get line content after "Path=" ?
Qual é uma maneira simples de obter o texto depois Path=
?
Respostas:
Começando em
Python 3.9
, você pode usarremoveprefix
:fonte
Se a string for fixa, você pode simplesmente usar:
que fornece tudo da posição 5 na sequência (uma sequência também é uma sequência, portanto esses operadores de sequência também funcionam aqui).
Ou você pode dividir a linha no primeiro
=
:Então param é "Caminho" e valor é o restante após o primeiro =.
fonte
split
lança uma exceção se o delimitador não estiver presente.partition
é mais estável, também divide uma string e sempre retorna uma tupla de três elementos com pré, delimitador e pós-conteúdo (alguns dos quais podem ser''
se o delimitador não estava presente). Por exemplovalue = line.partition('=')
,.Remover prefixo de uma sequência
Divida na primeira ocorrência do separador via
str.partition()
Analisar arquivo semelhante ao INI com o ConfigParser
Outras opções
str.split()
re.match()
fonte
fonte
Para fatiar (condicional ou não condicional) em geral, prefiro o que um colega sugeriu recentemente; Use a substituição por uma string vazia. Mais fácil de ler o código, menos código (às vezes) e menos risco de especificar o número errado de caracteres. Está bem; Eu não uso Python, mas em outras línguas prefiro esta abordagem:
ou - para acompanhar o primeiro comentário deste post - se isso for feito apenas se a linha começar com
Path
:A principal diferença em relação ao que foi sugerido acima é que não há "número mágico" (5) envolvido, nem há necessidade de especificar '
5
' e a string 'Path=
'. Em outras palavras, prefiro essa abordagem a partir de uma manutenção de código ponto de vista.fonte
rightmost = re.sub('^Path=', '', fullPath)
. O objetivo docompile()
método é tornar as coisas mais rápidas se você reutilizar o objeto compilado, mas como você o joga fora depois de usá-lo, ele não tem efeito aqui. Geralmente, não vale a pena se preocupar com essa otimização.Eu prefiro
pop
indexar[-1]
:para
fonte
startswith
já foi testado e, portantosplit
, dividirá "nada" antes e tudo o mais depois.split("Path=", 1)
é mais preciso (no caso do prefixo reaparecer mais tarde na sequência), mas reintroduz um número mágico.Ou porque não
fonte
E se..
Esse trigêmeo é a cabeça, o separador e a cauda .
fonte
A maneira mais simples de pensar é com o fatiamento:
Uma observação rápida na notação de fatia, usa dois índices em vez do habitual. O primeiro índice indica o primeiro elemento da sequência que você deseja incluir na fatia e o último índice é o índice imediatamente após o último elemento que você deseja incluir na fatia.
Por exemplo:
A fatia consiste em todos os elementos entre
first_index
elast_index
, incluindofirst_index
e nãolast_index
. Se o primeiro índice for omitido, o padrão será o início da sequência. Se o último índice for omitido, ele incluirá todos os elementos até o último elemento na sequência. Índices negativos também são permitidos. Use o Google para saber mais sobre o tópico.fonte
fonte
r''
cadeias de caracteres para caminhos do Windows. 2.re.match()
pode retornar NoneOutra linha simples que não foi mencionada aqui:
Isso também funcionará corretamente para vários casos extremos:
fonte
dá-lhe caracteres após os cinco primeiros.
fonte
line[5:]
dará a substring que você deseja. Pesquise a introdução e procure por 'notação de fatia'fonte
Se você conhece as compreensões da lista:
fonte
line.startswith(...)
10 vezes mais rápida. Meus testes não confirmaram isso. É um prazer alterá-lo se forem fornecidas evidências que sustentam essa afirmação.A versão pop não estava certa. Eu acho que você quer:
fonte
Por que não usar regex com escape?
^
corresponde à parte inicial de uma linha ere.MULTILINE
corresponde a cada linha.re.escape
garante que a correspondência seja exata.fonte
Experimente o código a seguir
fonte
Eu acho que é isso que você está procurando exatamente
fonte
sem ter que escrever uma função, isso será dividido de acordo com a lista, neste caso 'Sr. | Dr. | Sra.', selecione tudo após dividir com [1], depois divida novamente e pegue qualquer elemento. No caso abaixo, 'Morris' é retornado.
fonte
Isso é muito semelhante na técnica a outras respostas, mas sem operações repetidas de cadeias, capacidade de saber se o prefixo estava lá ou não, e ainda assim é legível:
fonte