Saya memiliki beberapa kode python sederhana yang mencari file untuk string misalnya path=c:\path
, di mana c:\path
bagian tersebut dapat bervariasi. Kode saat ini adalah:
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=" ?
Apa cara sederhana untuk mendapatkan teks setelahnya Path=
?
Jawaban:
Mulai dengan
Python 3.9
, Anda dapat menggunakanremoveprefix
:sumber
Jika string sudah diperbaiki, Anda cukup menggunakan:
yang memberi Anda segalanya dari posisi 5 di dalam string (string juga merupakan urutan sehingga operator urutan ini juga bekerja di sini).
Atau Anda dapat membagi garis pada awalnya
=
:Maka param adalah "Path" dan nilai adalah sisanya setelah = pertama.
sumber
split
melemparkan pengecualian jika pembatas tidak ada.partition
lebih stabil, ia juga membagi string dan selalu mengembalikan tuple tiga elemen dengan pre-, delimiter, dan post-content (beberapa di antaranya mungkin''
jika pembatas tidak ada). Misalnyavalue = line.partition('=')
,.Hapus awalan dari string
Berpisah pada kemunculan pertama pemisah via
str.partition()
Parse file seperti ini dengan ConfigParser
Pilihan lain
str.split()
re.match()
sumber
sumber
Untuk memotong (kondisional atau non-kondisional) secara umum saya lebih suka apa yang disarankan rekan kerja baru-baru ini; Gunakan pengganti dengan string kosong. Lebih mudah membaca kode, lebih sedikit kode (kadang-kadang) dan lebih sedikit risiko menentukan jumlah karakter yang salah. Baik; Saya tidak menggunakan Python, tetapi dalam bahasa lain saya lebih suka pendekatan ini:
atau - untuk menindaklanjuti komentar pertama untuk posting ini - jika ini hanya boleh dilakukan jika baris dimulai dengan
Path
:Perbedaan utama dengan beberapa yang telah disarankan di atas adalah bahwa tidak ada "angka ajaib" (5) yang terlibat, atau kebutuhan untuk menentukan '
5
' dan string 'Path=
', Dengan kata lain saya lebih suka pendekatan ini dari pemeliharaan kode sudut pandang.sumber
rightmost = re.sub('^Path=', '', fullPath)
. Tujuan daricompile()
metode ini adalah untuk membuat segalanya lebih cepat jika Anda menggunakan kembali objek yang dikompilasi, tetapi karena Anda membuangnya setelah Anda menggunakannya, toh hal itu tidak berpengaruh di sini. Biasanya tidak perlu khawatir tentang pengoptimalan ini.Saya lebih suka
pop
pengindeksan[-1]
:untuk
sumber
startswith
telah diuji sehinggasplit
akan membagi "tidak ada" sebelumnya dan yang lainnya setelahnya.split("Path=", 1)
lebih tepat (dalam kasus awalan muncul kembali kemudian dalam string) tetapi memperkenalkan kembali angka ajaib.Atau mengapa tidak
sumber
Bagaimana tentang..
Triplet ini adalah kepala, pemisah, dan ekor .
sumber
Cara paling sederhana yang bisa saya pikirkan adalah dengan mengiris:
Catatan singkat tentang notasi slice, ini menggunakan dua indeks, bukan yang biasa. Indeks pertama menunjukkan elemen pertama dari urutan yang ingin Anda sertakan dalam slice dan indeks terakhir adalah indeks segera setelah elemen terakhir yang ingin Anda sertakan dalam slice.
Misalnya:
Irisan terdiri dari semua elemen antara
first_index
danlast_index
, termasukfirst_index
dan tidaklast_index
. Jika indeks pertama dihilangkan, maka akan default ke awal urutan. Jika indeks terakhir dihilangkan, itu mencakup semua elemen hingga elemen terakhir dalam urutan. Indeks negatif juga diperbolehkan. Gunakan Google untuk mempelajari lebih lanjut tentang topik tersebut.sumber
sumber
r''
string untuk jalur Windows. 2.re.match()
dapat mengembalikan Tidak AdaSatu kalimat sederhana yang belum disebutkan di sini:
Ini juga akan berfungsi dengan baik untuk berbagai kasus tepi:
sumber
memberi Anda karakter setelah lima pertama.
sumber
line[5:]
akan memberikan substring yang Anda inginkan. Cari pengantar dan cari 'notasi irisan'sumber
Jika Anda tahu daftar pemahaman:
sumber
line.startswith(...)
10X lebih cepat. Pengujian saya tidak mengonfirmasi hal ini. Senang mengubahnya jika bukti yang mendukung pernyataan itu diberikan.Versi popnya kurang tepat. Saya pikir Anda ingin:
sumber
Mengapa tidak menggunakan regex dengan melarikan diri?
^
cocok dengan bagian awal dari suatu baris danre.MULTILINE
cocok pada setiap baris.re.escape
memastikan bahwa pencocokan tepat.sumber
Coba ikuti kode
sumber
Saya kira inilah yang sebenarnya Anda cari
sumber
tanpa harus menulis fungsi, ini akan terpecah sesuai daftar, dalam hal ini 'Tuan | Dr. | Ny.', pilih semuanya setelah dipisah dengan [1], lalu belah lagi dan ambil elemen apa pun. Dalam kasus di bawah ini, 'Morris' dikembalikan.
sumber
Ini sangat mirip dalam teknik dengan jawaban lain, tetapi tanpa operasi string berulang, kemampuan untuk mengetahui apakah awalan ada di sana atau tidak, dan masih cukup mudah dibaca:
sumber