2013-06-17 12 views
5

Python'da düzenli ifade için bir yeni kullanıcıyım:
Bir çalışan adı içeriyorsa aramak istediğim bir listeye sahibim.Cümle içinde arama yapmak için normal ifadeleri nasıl kullanabilirim? Büyük/küçük harf duyarlı değil

çalışanın adı olabilir:

  • uzay ardından başında olabilir.
  • Â ®
  • ardından YA boşluk bulunduğunda
  • VEYA sonu ve boşlukta olabilir o
  • değil bir olgu daha önce duyarlı

ListSentence = ["Steve®", "steveHotel", "Rob spring", "Car Daniel", "CarDaniel","Done daniel"] 
ListEmployee = ["Steve", "Rob", "daniel"] 

ListSentence'dan gelen çıktı:

["Steve®", "Rob spring", "Car Daniel", "Done daniel"] 
+0

Gerçekten '®'? Bu bir unicode hatası mı? – poolie

+0

Bunu daha açık hale getirebilir misin? “Rob spring” bir boşluk tarafından takip edilmez ve “sonunda ve uzayda” değildir. – poolie

+0

evet öyle. Bu bir ticaret işareti, – mongotop

cevap

2

Tüm bu senaryoları kontrol etmeniz gerektiğini düşünmüyorum. Yapman gereken tek şey kelime aralarını kontrol etmektir.

Sen (ayrıca küçük harf farkı için küçük harfe) bir ya da regex yapmak kelime sonları için \b çevrili için | ile ListEmployee listesine katılabilirsiniz ve bu çalışması gerekir:

regex = '|'.join(ListEmployee).lower() 
import re 
[l for l in ListSentence if re.search(r'\b(%s)\b' % regex, l.lower())] 

çıktı Olmalı :

['Steve\xb6\xa9', 'Rob spring', 'Car Daniel', 'Done daniel'] 
+1

Çok teşekkür ederim bozdoz !!!! cazibe gibi çalışıyor! – mongotop

+1

İyi. Bence Lerner'in de bir anlamı var. Muhtemelen regex gerekmez. Çözüme, normal ifadeler olmadan yapmanın bir yolunu ekleyeceğim. – bozdoz

+3

Buradaki '\ b' sembollerinin, 'dog & daniel # moretext' gibi dizelere izin vereceğinin farkında olun. Bu, –

2

Eğer sadece örnek gösterir gibi, bu gibi bir şey olmalı, boşluk içeren dizeler arıyorsanız:

[i for i in ListSentence if i.endswith('®') or (' ' in i)] 
+0

Hızlı yanıtınız için çok teşekkür ederim! Çalışan Listesi ile kontrol edilmek üzere, sadece listelenen çalışanlar aranır. – mongotop

6

Öncelikle tüm çalışanların isimlerini alıp, | karakteri ile onlara katılmak

(?:^|\s)((?:Steve|Rob|Daniel)(?:®)?)(?=\s|$) enter image description here

Önce birlikte size Avó bütün isimleri katılarak: benzediğini böylece ve dize sarın sonraki döngüler için iç içe geçmiş bir kümeyi kullanmanın performans yükünü id.

Ben ancak powershell bu

[array]$names = @("Steve", "Rob", "daniel") 
[array]$ListSentence = @("Steve®", "steveHotel", "Rob spring", "Car Daniel", "CarDaniel","Done daniel") 

# build the regex, and insert the names as a "|" delimited string 
$Regex = "(?:^|\s)((?:" + $($names -join "|") + ")(?:®)?)(?=\s|$)" 

# use case insensitive match to find any matching array values 
$ListSentence -imatch $Regex 

gibi yazmak isterim, bir piton örnek sunmak için yeterince iyi piton bilmiyorum

Steve® 
Rob spring 
Car Daniel 
Done daniel 
+0

Harika görünüyor! Yukarıdaki kodu nasıl kullanacağınız konusunda bana bir örnek verebilir misiniz? Çok teşekkür ederim! – mongotop

+3

Güzel grafik, ne yapmak için kullandınız? –

+1

http://www.regexper.com/ –

3

Neden düzenli kullanmak istiyorsunuz verimleri ifade? Genellikle Python'da bunlardan kaçınmanızı öneriyorum - bunun yerine string metodlarını kullanabilirsiniz. Örneğin

:

def string_has_employee_name_in_it(test_string): 
    test_string = test_string.lower() # case insensitive 
    for name in ListEmployee: 
     name = name.lower() 
     if name == test_string: 
      return True 
     elif name + '®' == test_string: 
      return True 
     elif test_string.endswith(' ' + name): 
      return True 
     elif test_string.startswith(name + ' '): 
      return True 
     elif (' ' + name + ' ') in test_string: 
      return True 
    return False 

final_list = [] 
for string in ListSentence: 
    if string_has_employee_name_in_it(string): 
     final_list.append(string) 

final_list istediğiniz listesidir. Bu bir normal ifadeden daha uzun, ama ayrıştırmak ve sürdürmek de çok daha kolay. Çeşitli şekillerde çok daha kısa yapabilirsiniz (örn. Testleri fonksiyonda birleştirmek ve bir döngü yerine liste kavramasını kullanmak), fakat Python ile çalışmaya başladığınızda neler olup bittiğine dair net bir fikirdir. .

+1

Muhtemelen doğru, bu OP'de regex kullanmanız gerekmiyor. Bunun da karmaşık olması gerektiğini düşünmüyorum. Sanırım bu unicode karakterleri kesebilir ve 'listeden isimde 'kontrol edebilirsiniz. – bozdoz

+0

Harika çözüm! kontrol eğer regex juts gerek yok !!!! – mongotop

+0

@bozdoz, çok iyi biri! Unicode karakterleri kaldırın ve düz bir kontrol yapın! Onu seviyorum!! Bu akşam çok şey öğrendim! Hepinize teşekkür ederim !! – mongotop

1

muhtemel bir çözüm:

import re 

ListSentence = ["Steve®", "steveHotel", "Rob spring", "Car Daniel", "CarDaniel","Done daniel"] 
ListEmployee = ["Steve", "Rob", "daniel"] 


def findEmployees(employees, sentence): 
    retval = [] 
    for employee in employees: 
     expr = re.compile(r'(^%(employee)s(®)?(\s|$))|((^|\s)%(employee)s(®)?(\s|$))|((^|\s)%(employee)s(®)?$)' 
      % {'employee': employee}, 
      re.IGNORECASE) 
     for part in sentence: 
      if expr.search(part): 
       retval.append(part) 
    return retval 



findEmployees(ListEmployee, ListSentence) 

>> Returns ['Steve\xc3\x82\xc2\xae', 'Rob spring', 'Car Daniel', 'Done daniel'] 
+1

re.compile() 'işlevi için harika çağrı! Teşekkürler Orlenko !! – mongotop

+1

@ Denomales'in '\ b' hakkında yaptığı yorumun \ W için de geçerli olduğuna dikkat edin. Regex'imi bir dakika içinde daha sağlam bir şekilde güncelleyeceğim. – orlenko

+1

Çok teşekkür ederim Orlenko !! – mongotop

İlgili konular