Saya mencoba menemukan setiap 10 digit rangkaian angka dalam rangkaian angka yang lebih besar menggunakan re di Python 2.6.
Saya dengan mudah dapat meraih tidak ada pertandingan yang tumpang tindih, tetapi saya ingin setiap pertandingan dalam seri nomor. Misalnya.
di "123456789123456789"
Saya harus mendapatkan daftar berikut:
[1234567891,2345678912,3456789123,4567891234,5678912345,6789123456,7891234567,8912345678,9123456789]
Saya telah menemukan referensi ke "lookahead", tetapi contoh yang saya lihat hanya menunjukkan pasangan angka daripada pengelompokan yang lebih besar dan saya belum dapat mengubahnya melebihi dua digit.
python
regex
overlapping
danspants
sumber
sumber
(a|ab|abc)
umumnya dapat ditulis ulang sebagai ekspresi yang tidak tumpang tindih dengan grup tangkapan bersarang, misalnya(a(b(c)?)?)?
, di mana kami mengabaikan semua kecuali grup tangkapan terluar (yaitu paling kiri) saat membongkar sebuah pertandingan; memang ini sedikit menyakitkan dan kurang terbaca. Ini juga akan menjadi regex yang lebih berkinerja untuk dicocokkan.Jawaban:
Gunakan grup penangkap di dalam lookahead. Lookahead menangkap teks yang Anda minati, tetapi kecocokan sebenarnya secara teknis adalah substring dengan lebar nol sebelum lookahead, sehingga secara teknis kecocokan tidak tumpang tindih:
import re s = "123456789123456789" matches = re.finditer(r'(?=(\d{10}))',s) results = [int(match.group(1)) for match in matches] # results: # [1234567891, # 2345678912, # 3456789123, # 4567891234, # 5678912345, # 6789123456, # 7891234567, # 8912345678, # 9123456789]
sumber
Anda juga dapat mencoba menggunakan modul pihak ketiga
regex
(bukanre
), yang mendukung pencocokan tumpang tindih.>>> import regex as re >>> s = "123456789123456789" >>> matches = re.findall(r'\d{10}', s, overlapped=True) >>> for match in matches: print(match) # print match ... 1234567891 2345678912 3456789123 4567891234 5678912345 6789123456 7891234567 8912345678 9123456789
sumber
TypeError: findall() got an unexpected keyword argument 'overlapped'
regex
modul terlebih dahulu:pip install regex
Saya menyukai ekspresi reguler, tetapi tidak diperlukan di sini.
Secara sederhana
s = "123456789123456789" n = 10 li = [ s[i:i+n] for i in xrange(len(s)-n+1) ] print '\n'.join(li)
hasil
1234567891 2345678912 3456789123 4567891234 5678912345 6789123456 7891234567 8912345678 9123456789
sumber
0 <= i < len(s)-n+1
dijamin menjadi awal dari pertandingan 10 digit. Juga saya pikir kode Anda dapat dipercepat, akan menarik untuk kode-golf untuk kecepatan.