Python

2013-11-27 5 views
6

BenPython

string = "123hello456world789" 

dize hiçbir spacess içermeyen içeren bir dize değişkeni var re.search. L (a-z) içeren baskı sadece kelimeleri I

pat = "([a-z]+){1,}" 
match = re.search(r""+pat,word,re.DEBUG) 

karşılaştırmak nesne, kelimeyi, yalnızca Hello ve kelime World eşleşmediği basit bir normal ifade güvenilir şekilde bir düzenli ifade yazmak istiyorum.

re.findall() ne zaman kullanılır? Hello ve World öğelerini alabilirim.

Sorumu neden re.search() ile yapamıyoruz?

re.search() ile nasıl?

+0

Çünkü "merhaba" ve "dünya" bitişik değil, ancak deseninizin aradığı şey budur. –

+1

Bunu neden 're.search' ile yapmak istiyorsunuz? –

+0

Özgün ifademde yaklaşık 4 grubum var. By, ** re.findall ** 'ı kullanarak gruplar halinde tam bir eşleşme elde edemedim. ** re.search() ** kullanarak ** match.group() ** –

cevap

9

re.search() deseni kez dizede, documenation bulur: Düzenli ifade modeli bir maç üreten bir yer arayan dize yoluyla

Tarama ve karşılık gelen MatchObject örneğini döndürür. Dizideki hiçbir konum modeliyle eşleşmezse, Hiçbiri Hiçbiri; Bu, dizede bir noktada sıfır uzunluklu eşleşme bulmaktan farklı olduğunu unutmayın. dizeleri listesi gibi,

Return dizesinde desen her örtüşmeyen maçlar: her oluşumunu maç için

, sen re.findall(), documentation gerekir. Dize soldan sağa taranır ve eşleşmeler, bulunan sırayla döndürülür. Modelde bir veya daha fazla grup varsa, bir grup listesi döndürür; Bu, modelinin birden fazla gruba sahip olması halinde, bir tupl listesi olacaktır. Boş eşlemeler, başka bir eşleşmenin başlangıcına dokunmadıkça sonucuna dahil edilir.

Örnek:

>>> import re 
>>> regex = re.compile(r'([a-z]+)', re.I) 
>>> # using search we only get the first item. 
>>> regex.search("123hello456world789").groups() 
('hello',) 
>>> # using findall we get every item. 
>>> regex.findall("123hello456world789") 
['hello', 'world'] 

GÜNCELLEME:

Nedeniyle your duplicate question (as discussed at this link) Ben de burada benim diğer cevabı ekledik:

>>> import re 
>>> regex = re.compile(r'([a-z][a-z-\']+[a-z])') 
>>> regex.findall("HELLO W-O-R-L-D") # this has uppercase 
[] # there are no results here, because the string is uppercase 
>>> regex.findall("HELLO W-O-R-L-D".lower()) # lets lowercase 
['hello', 'w-o-r-l-d'] # now we have results 
>>> regex.findall("123hello456world789") 
['hello', 'world'] 

Gördüğünüz gibi, sağladığınız ilk örnekte başarısız olmanızın nedeni büyük harf yüzünden, re.IGNORECASE bayrağını ekleyebilirsiniz, ancak bu eşleşmelerin yalnızca küçük harfle yazılması gerektiğini belirttiniz.

+1

OP, bir sebepten dolayı 'findall()' kullanmak istemiyor. Bu sorunun bütün noktasıydı. –

+0

@MartijnPieters OP ayrıca "neden bunu re.search()" ile yapamıyoruz "sorusunu da sordu. –

+0

İlk düzenlemeniz bu soruyu yanıtlamadı. –

1

@InbarRose yanıtı neden olduğunu gösterir.arama bu şekilde çalışır, ancak match nesneleri yerine re.findall sadece dize çıkışları istiyorsanız Ayrıca kötü bir fikir genellikle olan bir list

>>> list(re.finditer(pat, string)) 
[<_sre.SRE_Match object at 0x022DB320>, <_sre.SRE_Match object at 0x022DB660>] 

istiyorsa, re.finditer

>>> for match in re.finditer(pat, string): 
...  print match.groups() 
... 
('hello',) 
('world',) 
>>> 

Veya alternatif kullanmak Ortak bir modül olduğu için string değişken adı olarak kullanın.