Rumah >pembangunan bahagian belakang >Tutorial Python >Mengapa Adakah `re.findall()` Mengembalikan Senarai Kosong Apabila `re.search()` Menemui Padanan?

Mengapa Adakah `re.findall()` Mengembalikan Senarai Kosong Apabila `re.search()` Menemui Padanan?

Linda Hamilton
Linda Hamiltonasal
2024-12-19 09:23:09112semak imbas

Why Does `re.findall()` Return an Empty List When `re.search()` Finds a Match?

re.findall Behavior

Fungsi re.findall() boleh mengelirukan jika ia tidak mengembalikan hasil yang dijangkakan apabila memadankan rentetan. Mari kita terokai sebab di sebalik kelakuannya dalam kes tertentu.

Pernyataan Masalah

Pertimbangkan rentetan sumber berikut:

s = r'abc123d, hello 3.1415926, this is my book'

Dan corak berikut:

pattern = r'-?[0-9]+(\.[0-9]*)?|-?\.[0-9]+'

Dengan re.search, kami mendapat yang betul hasil:

m = re.search(pattern, s)
print(m)  # <_sre.SRE_Match object; span=(3, 6), match='123'>

Walau bagaimanapun, re.findall mengembalikan senarai kosong:

L = re.findall(pattern, s)
print(L)  # []

Memahami Isu

Terdapat dua aspek utama kepada pertimbangkan:

  1. Kumpulan Tangkapan Padanan Kosong: re.findall mengembalikan teks yang ditangkap daripada objek padanan, tetapi dalam corak ini, tiada kumpulan tangkapan. Akibatnya, ia mengembalikan rentetan kosong.
  2. Melepaskan Watak: \. dalam corak sepadan dengan dua aksara: dan mana-mana aksara kecuali baris baharu. Ini tidak bertujuan untuk memadankan nilai angka.

Penyelesaian

Untuk memadankan nilai angka dengan betul, gunakan corak berikut:

pattern = r'-?\d*\.?\d+'

Corak ini sepadan dengan:

  • -? - Tanda tolak pilihan
  • d* - Digit pilihan
  • .? - Pemisah perpuluhan pilihan
  • d - Satu atau lebih digit

Dengan corak yang diperbetulkan ini, re.findall akan mengembalikan senarai yang dijangkakan:

['123', '3.1415926']

Atas ialah kandungan terperinci Mengapa Adakah `re.findall()` Mengembalikan Senarai Kosong Apabila `re.search()` Menemui Padanan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn