Soru Python re.sub bir bayrakla tüm oluşumların yerini almaz


Python belgeleri şunları söylüyor:

re.MULTILINE: Belirtildiğinde, '^' desen karakteri dizenin başlangıcında ve her satırın başlangıcında (her yeni satırın hemen ardından) eşleşir ... Varsayılan olarak, '^' yalnızca dizenin başlangıcında eşleşir. ...

Peki, şu beklenmedik sonucu aldığımda neler oluyor?

>>> import re
>>> s = """// The quick brown fox.
... // Jumped over the lazy dog."""
>>> re.sub('^//', '', s, re.MULTILINE)
' The quick brown fox.\n// Jumped over the lazy dog.'

44
2017-09-03 21:00


Menşei




Cevaplar:


Tanımına bakın re.sub:

sub(pattern, repl, string[, count])

4. argüman sayıyor, kullanıyorsunuz re.MULTILINE (8) sayı olarak, bayrak olarak değil.

Bayrakları kullanmak isterseniz regex'inizi derlemelisiniz.

re.sub(re.compile('^//', re.MULTILINE), '', s)

bir flags Python 2.7'de argüman eklendi, bu yüzden tam tanım şu an:

re.sub(pattern, repl, string[, count, flags])

Bunun anlamı şudur:

re.sub('^//', '', s, flags=re.MULTILINE)

Eserleri.


99
2017-09-03 21:08



sahip olmak daha iyi olurdu re.compile('^//', re.M).sub('', s) - SilentGhost
python'a ilettiğiniz bayrağı söylerseniz, derlemeniz gerekmez. - pseudosudo
@pseudosudo, bu argümanın yayınlanmasında bulunmayan Python 2.7'de bayrak argümanları eklendi. Bilgileri cevaba ekledim. - agf


re.sub('(?m)^//', '', s)

9
2018-03-25 16:10





Tam tanımı re.sub geçerli:

re.sub(pattern, repl, string[, count, flags])

Python'a parametrelerin neler olduğunu söylerseniz, flags geçmeden count:

re.sub('^//', '', s, flags=re.MULTILINE)

veya daha özlü:

re.sub('^//', '', s, flags=re.M)

6
2017-08-30 18:33



Yorumumu görün ve diğer cevabı düzenle. - agf
@agf Ah, tarihe bakmayı düşünmedim. - pseudosudo