cari

Rumah  >  Soal Jawab  >  teks badan

python中正则表达式*?的一个问题

1.看书上教材说*?是非贪婪模式,那么对于下面这段代码,为啥结果是空呢?

>>> import re
>>> line = 'cats are smart than dogs.'
>>> m=re.match(r'(.*?)',line)
>>> m.group()

结果为:''
为什么结果为空呢?不应该是cats么?难道字符串前默认有个空字符?
新手求明白人给解答下,谢谢了

PHP中文网PHP中文网2827 hari yang lalu752

membalas semua(4)saya akan balas

  • 大家讲道理

    大家讲道理2017-04-17 17:29:36

    . = mana-mana watak
    * = muncul 0 kali atau lebih, bersamaan dengan {0,}
    ? = mengambil yang mempunyai perlawanan sebelumnya yang paling sedikit, bersamaan dengan {0,1}

    Ringkasnya, ini bermaksud "mana-mana watak muncul 0 kali", jadi tiada apa-apa.

    Untuk memadankan cats, anda harus menggunakan ruang selepas cats, r'(.*?) '.

    balas
    0
  • 高洛峰

    高洛峰2017-04-17 17:29:36

    Pemahaman peribadi saya ialah .*? sepadan dengan ^, iaitu kedudukan permulaan Dalam ungkapan biasa, kedudukan juga boleh dipadankan, seperti:

    In [1]: s = 'a'
    In [2]: re.sub(r'^','b',s)
    Out[2]: 'ba'

    Contoh ini menggantikan ^, dan perkara yang sama berlaku untuk $, jadi .*? anda secara langsung sepadan dengan ^.
    PS: Apabila menggunakan ungkapan biasa, terutamanya jika terdapat banyak kandungan teks Ia tidak disyorkan untuk menggunakan .* tetapi [sS]* atau [dD]* dsb.

    balas
    0
  • 高洛峰

    高洛峰2017-04-17 17:29:36

    Ini ialah perbezaan antara padanan tamak ungkapan biasa dan padanan tidak tamak:

    • Mod tamak: Apabila padanan boleh dilakukan, padankan terpanjang . Ungkapan tidak berakhir dengan ?.

    • Mod tidak tamak: Apabila pemadanan boleh dilakukan, padankan terpendek . Ungkapan berakhir dengan ?.

    Sebagai contoh, rentetan abcabcabc, apabila saya ingin memadankan rentetan yang bermula dengan a dan berakhir dengan c, terdapat tiga padanan: abc, abcabc dan abcabcabc, antaranya yang paling Panjang abcabcabc boleh dipadankan dengan a.*c, manakala yang terpendek abc boleh dipadankan dengan a.*?c.

    >>> import re
    >>> line = "abcabcabc"
    >>> m = re.match(r'a.*c', line)
    >>> m.group()
    'abcabcabc'
    >>> m = re.match(r'a.*?c', line)
    >>> m.group()
    'abc'

    Kenapa keputusan kosong? Bukankah sepatutnya kucing?

    Oleh kerana .* ialah corak tamak, ia akan sepadan dengan rentetan terpanjang di mana setiap aksara ialah sebarang aksara (.), iaitu rentetan yang terdiri daripada semua aksara input. Dan .*? ialah mod tidak tamak, yang akan sepadan dengan rentetan terpendek di mana setiap aksara ialah sebarang aksara (.), iaitu rentetan kosong.

    Jika anda ingin memadankan perkataan kucing, anda harus menggunakan cats. Jika anda ingin memadankan perkataan pertama dalam rentetan input, anda harus menggunakan w atau S .

    >>> m=re.match(r'\w+',line)
    >>> m.group()
    'cats'
    >>> m=re.match(r'\S+',line)
    >>> m.group()
    'cats'

    Adakah terdapat aksara nol sebelum rentetan secara lalai?

    Tidak, tetapi dalam ungkapan biasa, anda boleh menggunakan ^ untuk mewakili kedudukan permulaan rentetan dan $ untuk mewakili kedudukan penamat. Ambil perhatian bahawa kedua-dua aksara ini (^ dan $) ialah simbol yang ditentukan oleh peraturan yang sepadan dan digunakan dalam rentetan peraturan yang anda tulis Ini tidak bermakna rentetan yang akan dipadankan mengandungi dua simbol ini.

    balas
    0
  • 黄舟

    黄舟2017-04-17 17:29:36

    . Pemadanan sempadan tidak menggunakan aksara dalam rentetan yang dipadankan, dan ia adalah mod tidak tamak, jadi rentetan

    tidak boleh dipadankan.

    balas
    0
  • Batalbalas