5

私はPythonでの正規表現の初心者です
。従業員名が含まれているかどうかを検索したいリストがあります。

従業員名は次のとおりです。

  • 先頭にスペースが続く場合があります。
  • 続いて®
  • またはスペースが続く
  • または最後にスペースを入れてもかまいません
  • 大文字と小文字を区別しない

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

からの出力ListSentenceは次のとおりです。

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

5 に答える 5

3

なぜ正規表現を使いたいのですか?通常、Python ではこれらを避けることをお勧めします。代わりに文字列メソッドを使用できます。

例えば:

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 は、必要なリストです。これは正規表現よりも長くなりますが、解析と保守がはるかに簡単です。さまざまな方法でもっと短くすることができます (たとえば、関数内のテストを結合したり、ループの代わりにリスト内包表記を使用したりします)。 .

于 2013-06-17T04:17:48.890 に答える
2

これらすべてのシナリオをチェックする必要はないと思います。あなたがする必要があるのは、単語の区切りをチェックすることだけだと思います。

ListEmployee リストを結合し|て、どちらかまたは正規表現 (大文字と小文字を区別しないように小文字にする) を作成し\b、単語の区切りを囲むことができます。これは機能するはずです。

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

出力する必要があります:

['Steve\xb6\xa9', 'Rob spring', 'Car Daniel', 'Done daniel']
于 2013-06-17T04:19:44.810 に答える
1

考えられる解決策:

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']
于 2013-06-17T04:31:30.277 に答える